Docker Go 映像:启动容器进程导致:exec:“app”:$PATH 中找不到可执行文件:

我一直在阅读很多关于不同语言的类似问题,但没有一个是 Go。


我刚刚使用我在官方 Docker 中心页面上遵循的说明创建了一个 Dockerfile :


FROM golang:1.17.3


WORKDIR /go/src/app

COPY . .


RUN go get -d -v ./...

RUN go install -v ./...


CMD ["app"]

这是我的文件夹结构:


users-service

 |-> .gitignore

 |-> Dockerfile

 |-> go.mod

 |-> main.go

 |-> README.md

如果有人需要查看一些代码,这就是我的main.go样子:


package main


import "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.0s


Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

然后我跑了docker run users-service,但我得到了那个错误:

$ docker 运行用户服务


docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:380:启动容器进程导致:exec:“app”:$PATH 中找不到可执行文件:未知。


我记得我GOPATH在 Windows 上的 Visual Studio Code 中遇到了一些环境变量问题,也许是相关的……有什么建议吗?


MMMHUHU
浏览 173回答 2
2回答

猛跑小猪

官方 Docker 文档有关于构建 Go 镜像的有用说明:https ://docs.docker.com/language/golang/build-images/总之,您需要构建您的 Go 二进制文件,并且需要适当地配置 CMD,例如:FROM golang:1.17.3WORKDIR /appCOPY main.go .COPY go.mod ./RUN go build -o /my-go-appCMD ["/my-go-app"]构建容器:$ docker build -t users-service .运行 docker 容器:$ docker run --rm -it users-serviceHello, World!

DIEA

您的“app”可执行二进制文件应该可以在您$PATH的全局调用中使用,而无需任何路径前缀。否则,您必须提供可执行文件的完整路径,例如CMD ["/my/app"]另外,我建议使用ENTRYPOINT指令。ENTRYPOINT指示可执行文件的直接路径,而CMD指示提供给ENTRYPOINT.使用组合指令使您的图像层最小化,与使用多个sRUN相比,您的整体图像大小变得更小一些。RUN
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go