# 指定編譯鏡像
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