尝试快速测试[Docker]多阶段构建
首先
在本文中,我打算简单尝试一下Docker的”多阶段构建”功能,并确认它的好处。
另外,我是Docker的初学者。我只是大致理解了一般技术书中所写的内容。
触发
被封面的副标题所吸引,我阅读了以下内容。
创建理想的容器形象 Dockerfile 的最佳实践。
以下是2023年11月号的软件设计杂志。如果您有兴趣,请务必点击此Amazon链接。
在其中,我有很多想要尝试的事情,但首先我要试试”多阶段构建”。
前提。
-
- golangを用いて、簡単なAPIをコンテナ化します。
-
- Dockerの基本的なお話は省略します。
- ベースイメージはalpine linuxを使用します。
先试试看
Dockerfile可以用中文翻译为容器文件。
-
- 筆者がこれまで書きがちだったdockerfile
一般的なDocker解説記事も、こんな書き方が多い気がします。
FROM golang:1.19.1-alpine
WORKDIR /app
COPY go.mod .
RUN go mod download
COPY . .
RUN go build -o main ./src/main.go
CMD ["./main"]
- マルチステージビルドの場合のdockerfile
# ビルド環境
FROM golang:1.19.1-alpine AS builder
WORKDIR /app
COPY go.mod .
RUN go mod download
COPY . .
# バイナリをビルド
RUN go build -o main ./src/main.go
# 実行環境
# ビルド環境と違い、golangは入っていない
FROM alpine:latest AS production
WORKDIR /app
# ビルド環境から「main」をコピー
COPY --from=builder /app/main .
# 実行
CMD ["./main"]
构建与结果
- そのままビルドした結果です。
REPOSITORY TAG IMAGE ID CREATED SIZE
go-api-multi latest 36c47c54cd23 3 minutes ago 14MB ⭐️マルチステージビルド
go-api latest 06b667ab680e 11 minutes ago 359MB
-
- マルチステージビルドのサイズ:14MB
-
- マルチステージビルドをしなかった場合のサイズ:359MB
結論:約25分の1になりました。(アプリとか、ベースイメージにより変わります)
结论
- マルチステージビルドを使用すると、コンテナのサイズが節約できますね。(約25分の1は無視できないですね。)
最後
这次我用golang试了一下,但是对于node应用来说,devDependencies的模块大小可能可以节省一些空间。
请务必查看以下详细解释。一旦您对Docker有一定了解,您将找到进一步提升技巧的各种方法。
如果你对2023年11月号的《软件设计》杂志感兴趣的话,这是Amazon的链接。请务必点击查看。