我一直在閱讀很多關于不同語言的類似問題,但沒有一個是 Go。我剛剛使用我在官方 Docker 中心頁面上遵循的說明創建了一個 Dockerfile :FROM golang:1.17.3WORKDIR /go/src/appCOPY . .RUN go get -d -v ./...RUN go install -v ./...CMD ["app"]這是我的文件夾結構:users-service |-> .gitignore |-> Dockerfile |-> go.mod |-> main.go |-> README.md如果有人需要查看一些代碼,這就是我的main.go樣子:package mainimport "fmt"func main() { fmt.Println("Hello, World!")}我跑了docker build -t users-service .:$ docker build -t users-service .[+] Building 5.5s (11/11) FINISHED => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 154B 0.1s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/golang:1.17.3 3.3s => [auth] library/golang:pull token for registry-1.docker.io 0.0sUse 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them然后我跑了docker run users-service,但我得到了那個錯誤:$ docker 運行用戶服務docker:來自守護進程的錯誤響應:OCI 運行時創建失?。篶ontainer_linux.go:380:啟動容器進程導致:exec:“app”:$PATH 中找不到可執行文件:未知。我記得我GOPATH在 Windows 上的 Visual Studio Code 中遇到了一些環境變量問題,也許是相關的……有什么建議嗎?
2 回答

猛跑小豬
TA貢獻1858條經驗 獲得超8個贊
官方 Docker 文檔有關于構建 Go 鏡像的有用說明:https ://docs.docker.com/language/golang/build-images/
總之,您需要構建您的 Go 二進制文件,并且需要適當地配置 CMD,例如:
FROM golang:1.17.3
WORKDIR /app
COPY main.go .
COPY go.mod ./
RUN go build -o /my-go-app
CMD ["/my-go-app"]
構建容器:
$ docker build -t users-service .
運行 docker 容器:
$ docker run --rm -it users-service
Hello, World!

DIEA
TA貢獻1820條經驗 獲得超2個贊
您的“app”可執行二進制文件應該可以在您$PATH
的全局調用中使用,而無需任何路徑前綴。否則,您必須提供可執行文件的完整路徑,例如CMD ["/my/app"]
另外,我建議使用ENTRYPOINT
指令。ENTRYPOINT
指示可執行文件的直接路徑,而CMD
指示提供給ENTRYPOINT
.
使用組合指令使您的圖像層最小化,與使用多個sRUN
相比,您的整體圖像大小變得更小一些。RUN
- 2 回答
- 0 關注
- 197 瀏覽
添加回答
舉報
0/150
提交
取消