之前一篇文章可以多阶段构建镜像,这样镜像就小很多.但是还有一个更好的方法是使用upx压缩二进制文件.这样二进制文件就更小了.
比如上篇文章构建的一个demo.多阶段构建镜像之后是7.627MB
使用了upx之后只有2.4MB
0x01 构建upx镜像
基于golang 1.15 构建一个upx镜像
FROM golang:1.15
RUN apt-get update && apt-get install -y xz-utils && rm -rf /var/lib/apt/lists/*
ADD https://github.com/upx/upx/releases/download/v3.96/upx-3.96-amd64_linux.tar.xz /usr/local
RUN xz -d -c /usr/local/upx-3.96-amd64_linux.tar.xz | tar -xOf - upx-3.96-amd64_linux/upx > /bin/upx && chmod a+x /bin/upx
CMD ["bash"]
go build -t upx:1.0 .
0x02 使用upx压缩
构建完upx镜像之后.使用上篇文章的Dockerfile.进行修改
FROM upx:1.0 as build
WORKDIR /go/release
COPY . .
RUN export GO111MODULE=on&& \
export GOPROXY=https://goproxy.cn&& \
go mod download
RUN GOOS=linux CGO_ENABLED=0 go build -ldflags="-s -w" -installsuffix cgo -o app&& upx -9 ./app
FROM scratch as prod
COPY --from=build /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=build /go/release/app /
CMD ["/app"]
上篇文章使用golang:1.15作为基础镜像,这里我们用upx 1.0作为基础镜像,使用 upx - 9进行压缩.然后再进行多阶段构建镜像.