基于Ubuntu镜像多阶段构建Go应用Docker部署报错及解决
问题场景
在testdocker目录下执行docker compose up命令,尝试通过多阶段构建(基于Go镜像编译,最终使用Ubuntu镜像运行)部署Go应用时出现运行报错。
目录结构:
- /testdocker
- main.go
- go.mod
- Dockerfile
- docker-compose.yml
原Dockerfile配置:
# golang base image FROM golang:1.19-alpine as golangBase RUN mkdir /app ADD . /app WORKDIR /app RUN go mod tidy && go build -o handlerBuild main.go FROM ubuntu:latest RUN mkdir /app WORKDIR /app COPY --from=golangBase /app . ENTRYPOINT [ "/app/handlerBuild" ]
问题原因
Alpine Linux默认使用musl libc,而Ubuntu使用glibc。Go默认开启CGO时,编译出的二进制文件会依赖构建环境的系统libc,导致在Ubuntu镜像中运行时出现libc依赖不兼容的错误。
解决方案
在Go构建命令中添加CGO_ENABLED=0参数,强制构建完全静态的二进制文件,不依赖系统libc。
修正后的Dockerfile:
# golang base image FROM golang:1.19-alpine as golangBase RUN mkdir /app ADD . /app WORKDIR /app RUN go mod tidy && CGO_ENABLED=0 go build -o handlerBuild main.go FROM ubuntu:latest RUN mkdir /app WORKDIR /app COPY --from=golangBase /app/handlerBuild . ENTRYPOINT [ "/app/handlerBuild" ]
(注:可优化COPY步骤,仅复制编译好的二进制文件,进一步减少镜像体积)
内容的提问来源于stack exchange,提问作者patabhu
相关产品推荐
相关产品推荐

