我一直在阅读很多关于不同语言的类似问题,但没有一个是 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 运行时创建失败:container_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 关注
- 169 浏览
添加回答
举报
0/150
提交
取消