Go應用程序使用dockerfile multi-stage的問題

場景重現

一個簡單的go應用,準備經過docker部署,爲了減小運行時的鏡像和容器體積,使用了multi-stage構建:linux

# dockerfile 大體以下

# 一級構建使用帶golang環境的鏡像
FROM golang:1.8.3 AS app-build
WORKDIR /go/src/app/
RUN go install
# 生成可執行文件 

# 二級構建使用alpine:3.7,體積小
FROM alpine:3.7
# 拷貝上面一級構建中生成的可執行文件
COPY --from=golb-build ./go/bin/app .
ENTRYPOINT ["/go/bin/app"]

dockefile生成構建是正常,運行container的時候會報錯:git

docker run --name app-1 --publish 80:80 -it app:latest
standard_init_linux.go:195: exec user process caused "no such file or directory"

問題緣由

聽說是鏡像golangalpine的操做系統雖然都是linux,可是底層架構不同,因此在golang鏡像生成的可執行文件無法在alpine操做系統上運行(在哪裏看到的英文解釋,再看到的話補上連接)golang

  • debian/ubuntu等linux下通用的是glibc;
  • 但alpine下使用的musl libc.

解決方案

  1. 嘗試用帶golang環境的alpine鏡像來構建,而後把構建生成的可執行文件拷貝到純淨的alpine鏡像中,這樣就不存在上面的問題了.
    • 嘗試使用鏡像golang:1.9.4-alpine3.7,發現執行到go get -v .時保存,該鏡像內不包含git工具...
    • 構建鏡像中安裝git工具apk add --no-cache git...
    • 最後鏡像生成,容器運行成功.鏡像大小僅有13MB...
  2. 嘗試golang的交叉編譯
    • 對交叉編譯不是很瞭解...有機會再嘗試

參考文檔

相關文章
相關標籤/搜索