我正在嘗試使用 Dockerfile 和 go file 二進制文件創建一個 docker 容器。我的文件夾中有兩個文件:Dockerfile和main,其中后者是我的簡單 go 文件的二進制文件。Dockerfile 的內容:FROM golang:1.11-alpineWORKDIR /appCOPY main /app/RUN ["chmod", "+x", "/app/main"]ENTRYPOINT ["./main"]我嘗試了以下步驟:sudo docker build -t naive5cr 。sudo docker run -d -p 8080:8080 naive5cr我通過“docker logs”看到的錯誤:standard_init_linux.go:207: exec 用戶進程導致“沒有這樣的文件或目錄”我的go文件內容[我認為這與問題無關]:func main() { http.HandleFunc("/", index) http.ListenAndServe(port(), nil)}func port() string { port := os.Getenv("PORT") if len(port) == 0 { port = "8080" } return ":" + port } 二進制“main”在獨立運行時按預期運行。所以go文件的內容是沒有問題的。
2 回答

胡說叔叔
TA貢獻1804條經驗 獲得超8個贊
CGO_ENABLED=0
當在 Go 中使用網絡時,您需要編譯以防止在 Linux 上鏈接到 libc。Alpine 附帶 musl 而不是 libc,并且嘗試查找 libc 會導致沒有這樣的文件或目錄錯誤。您可以通過運行ldd main
查看動態鏈接來驗證這一點。
您還可以在基于 Alpine 的主機上構建以鏈接到 musl 而不是 libc。完全靜態編譯的二進制文件的優點是能夠從頭開始運行,根本不需要任何庫。

慕田峪9158850
TA貢獻1794條經驗 獲得超8個贊
go 編譯為本機代碼,因此請確保在 Docker 映像上構建您的 go 代碼,而不是將二進制文件復制到 docker 映像。
例如
FROM golang:1.11-alpine
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp
ENTRYPOINT ./goapp
另外作為獎勵,這里是如何使用多階段 Docker 構建創建非常小的 Docker 鏡像:
FROM golang:1.11-alpine AS build-env
ADD . /src
RUN cd /src && go build -o goapp
FROM alpine
WORKDIR /app
COPY --from=build-env /src/goapp /app/
ENTRYPOINT ./goapp
- 2 回答
- 0 關注
- 161 瀏覽
添加回答
舉報
0/150
提交
取消