問題
我寫好了一個(gè)基于gin的web程序,另外還有一些依賴唧瘾。我費(fèi)了千辛萬苦才把依賴下載下來措译,我不想在docker鏡像里面在下載一次依賴,如何能夠快速的給我構(gòu)建一個(gè)鏡像饰序。
有問題的解決方法
golang
作為編譯型語言领虹,運(yùn)行的是編譯完成的二進(jìn)制可執(zhí)行文件,該文件是與運(yùn)行系統(tǒng)有關(guān)的求豫。我的開發(fā)系統(tǒng)是ubuntu1604塌衰。所以我的解決思路是如下
- 我先編譯出可執(zhí)行文件
- 將文件copy到
ubuntu:16.04
的鏡像中
這個(gè)沒問題,但是存在一個(gè)問題蝠嘉,該鏡像太大了最疆,300M。 我本身的程序打包完了才14M蚤告。能不能讓我的鏡像小一點(diǎn)努酸?
于是我把FROM ubuntu:16.04
改成FROM amd64/alpine
結(jié)果發(fā)現(xiàn)報(bào)了執(zhí)行錯(cuò)誤
`panic: standard_init_linux.go:175: exec user process caused "no such file or directory``
大概的原因就是我編譯出問題杜恰,我可不想慢慢去找可是的apline的操作系統(tǒng)鏡像仍源。
完善的解決方法
利用golang
鏡像
原理是將你的環(huán)境通過掛載到golang
鏡像中去,例如我使用的golang
版本為1.9
cd ~/go/src/your_app_path
docker run --rm -it -v "$GOPATH":/gopath -v "$(pwd)":/app -e "GOPATH=/gopath" -w /app golang:1.9 sh -c 'CGO_ENABLED=0 go build -a --installsuffix cgo --ldflags="-s" -o your_app_bin_name'
這個(gè)時(shí)候你的~/go/src/your_app_path
路徑就有一個(gè)your_app_bin_name
基于iron/base
鏡像
FROM iron/base
WORKDIR /app
COPY your_app_bin_name/app/
ENTRYPOINT ["./your_app_bin_name"]
這樣我打包出來的鏡像才5M
加上我二進(jìn)制文件的大小笼踩,只有19M
。
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)是:鏡像非常小嚎于,Dockerfile簡單。
- 缺點(diǎn)是:出了問題昼伴,只能看日志。無法容器內(nèi)圃郊,重新編譯或者調(diào)試。