Golang服务器Docker部署遇可执行文件找不到错误,如何修改Dockerfile?
解决Golang服务Docker部署的可执行文件找不到问题
问题原因
编译生成的可执行文件golang-server被放在了根目录/,但Docker容器的默认$PATH不包含根目录,所以CMD ["golang-server"]无法定位到该执行文件。
解决方案
方案1:指定可执行文件的绝对路径
修改Dockerfile的CMD指令,直接使用编译后文件的绝对路径:
FROM golang:1.18 WORKDIR $GOPATH/src COPY . . RUN go mod download RUN go build -o /golang-server EXPOSE 8080 CMD ["/golang-server"]
方案2:将可执行文件放入$PATH包含的目录
把编译后的文件输出到/usr/local/bin(该目录默认在$PATH中),这样直接用文件名即可调用:
FROM golang:1.18 WORKDIR $GOPATH/src COPY . . RUN go mod download RUN go build -o /usr/local/bin/golang-server EXPOSE 8080 CMD ["golang-server"]
方案3:使用多阶段构建(推荐,缩小镜像体积)
官方Golang镜像体积较大,通过多阶段构建只保留最终可执行文件,大幅减少镜像大小:
# 第一阶段:编译代码 FROM golang:1.18 AS builder WORKDIR /app COPY . . RUN go mod download RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o golang-server . # 第二阶段:运行服务,使用轻量镜像 FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /app/golang-server . EXPOSE 8080 CMD ["./golang-server"]
验证命令
修改Dockerfile后,重新构建并运行:
docker build . -t golang-server docker run --network=golang-server --name=golang-server golang-server
内容的提问来源于stack exchange,提问作者Bill Software Engineer
相关产品推荐
相关产品推荐

