Docker 部署golang程式
問題
我寫好了一個基於gin的web程式,另外還有一些依賴。我費了千辛萬苦才把依賴下載下來,我不想在docker映象裡面在下載一次依賴,如何能夠快速的給我構建一個映象。
有問題的解決方法
golang
作為編譯型語言,執行的是編譯完成的二進位制可執行檔案,該檔案是與執行系統有關的。我的開發系統是ubuntu1604。所以我的解決思路是如下
ubuntu:16.04
這個沒問題,但是存在一個問題,該映象太大了,300M。 我本身的程式打包完了才14M。能不能讓我的映象小一點?
於是我把FROM ubuntu:16.04
改成FROM amd64/alpine
結果發現報了執行錯誤
panic: standard_init_linux.go:175: exec user process caused "no such file or directory``
大概的原因就是我編譯出問題,我可不想慢慢去找可是的apline的作業系統映象。
完善的解決方法
利用golang
映象
原理是將你的環境通過掛載到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'
這個時候你的~/go/src/your_app_path
路徑就有一個your_app_bin_name
基於iron/base
映象
FROM iron/base WORKDIR /app COPY your_app_bin_name/app/ ENTRYPOINT ["./your_app_bin_name"]
這樣我打包出來的映象才5M
加上我二進位制檔案的大小,只有19M
。
優缺點
- 優點是:映象非常小,Dockerfile簡單。
- 缺點是:出了問題,只能看日誌。無法容器內,重新編譯或者除錯。