Docker运行Go镜像报错exec:"app"可执行文件未在$PATH找到问题求助
问题根因
报错核心是容器启动时找不到名为app的可执行文件,和本地Windows的GOPATH配置无关,是Dockerfile中的CMD配置与Go编译产物的名称、路径不匹配导致。
官方Golang镜像默认GOPATH为/go,go install生成的可执行文件默认存放在$GOPATH/bin路径下,且编译生成的可执行文件名和go.mod中声明的模块名一致,并不会默认生成名为app的二进制文件。
解决方案
方案1:直接指定编译产物绝对路径
先确认go.mod第一行声明的模块名,比如模块名为users-service,则直接修改Dockerfile的CMD配置:
CMD ["/go/bin/users-service"]
如果不确定模块名,可以执行以下命令查看镜像内/go/bin下的实际文件名,再对应修改CMD即可:
docker run --rm --entrypoint ls users-service /go/bin
方案2:编译时指定输出文件名(更稳妥,无模块依赖)
直接修改Dockerfile的编译逻辑,主动指定输出的二进制文件路径,避免模块名带来的差异:
FROM golang:1.17.3 WORKDIR /go/src/app COPY . . # 直接编译输出到根目录,命名为app RUN go build -o /app main.go CMD ["/app"]
该方案下不需要再执行go get和go install命令,编译逻辑更清晰,也不会出现路径匹配问题。
方案3:适配原CMD的简写写法
如果需要保留CMD ["app"]的写法,可以将编译产物输出到系统PATH包含的路径下:
RUN go build -o /usr/local/bin/app main.go CMD ["app"]
额外优化建议
Go 1.17版本已经不推荐使用go get命令下载安装可执行文件,在启用go mod的项目中,直接go build或go install即可自动拉取依赖,原Dockerfile中的RUN go get -d -v ./...行可以直接删除,不影响构建流程。
内容的提问来源于stack exchange,提问作者Maramal
相关产品推荐
相关产品推荐

