# 指定编译镜像
FROM golang:latest AS development
# 下载源码
RUN git clone --progress --verbose --depth=1 https://github.com/Bpazy/rss-middleware /rss-middleware
WORKDIR /rss-middleware
# 编译
RUN go env && CGO_ENABLED=0 go build ./cmd/rss-middleware
# 指定二阶段镜像,用 alpine 的原因是它非常精巧
FROM alpine:latest AS production
ENV CRON ""
ENV QBITTORRENT ""
ENV QBITTORRENT_PASSWORD ""
ENV QBITTORRENT_USERNAME ""
ENV RSS ""
# 将一阶段编译结果复制到二阶段镜像中
COPY --from=development /rss-middleware/rss-middleware /rss-middleware/rss-middleware
WORKDIR /rss-middleware
ENTRYPOINT ./rss-middleware \
-rss $RSS \
-qbittorrent $QBITTORRENT \
-qbittorrent-username $QBITTORRENT_USERNAME \
-qbittorrent-password $QBITTORRENT_PASSWORD \
-cron="$CRON"
对比
先将上面 Dockerfile 中的二阶段逻辑注释掉,然后编译 docker build --no-cache . -t single
恢复多阶段 Dockerfile,再次编译 docker build --no-cache . -t multi
看结果可见差距悬殊:
PS C:\Users\hanzi> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
multi latest fee1a588ee7c 5 minutes ago 17.7MB
single latest b5657a91634f 5 minutes ago 916MB