在之前的文章Docker拉取,制作,提交镜像,推送到远程仓库中我们从centos镜像的基础上构建了一个拥有编译go项目的环境,但在提交后发现这样一个镜像有1G+的大小,这样镜像仓库早晚吃不消的。而且也没有必要把编译用的基础环境也一并提交上去。
改进
我最终需要的只是一个能运行app的容器,也就是说其他多余的环境和功能最终提交的时候可以省去。
那么我用基础镜像来编译。然后将二进制文件拷贝到alpine(一个轻巧的linux镜像)来运行app。
Dockerfile
# 使用自己制作的有go编译环境的镜像
FROM harbor.domain.com:8088/golang/golang1.12:v1.0 as base# 开启go mod
ENV GOPROXY https://goproxy.io
ENV GO111MODULE on# 切换当工作目录
WORKDIR /workplace# 拷贝项目文件到工作目录
COPY . /workplace
# 设置环境变量
ENV GOOS linux
ENV GOARCH amd64
ENV CGO_ENABLED=0
# 拉包 & 编译 RUN go mod download &&
go build -o app# 使用alpine镜像运行
FROM alpine as targetCOPY --from=base /workplace/app /tmp/app
# 根据你的服务暴露容器端口
EXPOSE 8080CMD ["/workplace/app"]
编译的时候指定最终编译的镜像
$ sudo docker build --target=target . -t $TEST_CONTAINER_NAME
最终镜像大小只有不到10M
当然镜像还有进一步优化的空间
比如编译时加参数-ldflags "-s -w"
省略符号表和忽略调试信息