網站首頁 編程語言 正文
引言
多階段構建方式,是在 Dockerfile
中使用多個 FROM
指令,每個 FORM
指令都是一個新的構建階段,并且可以方便地復制之前階段的構件。讓我們來看一個簡單的 Go
程序。代碼如下。
點擊此處您可以獲取代碼。
構建 Docker 鏡像
讓我們來為它構建 Docker
鏡像,Dockerfile
文件內容如下。
FROM golang:1.19-alpine WORKDIR /build COPY go.mod . RUN go mod download COPY . . RUN go build -o /main main.go ENTRYPOINT ["/main"]
完成后,我們得到了一個 359 MB大小的鏡像。
現在讓我們構建相同的程序,但使用多階段構建:
FROM golang:1.19-alpine as builder WORKDIR /build COPY go.mod . RUN go mod download COPY . . RUN go build -o /main main.go FROM alpine:3 COPY --from=builder main /bin/main ENTRYPOINT ["/bin/main"]
完成后,我們居然得到了一個只有 12 MB 大小的 Docker
鏡像。還不錯,我們把鏡像大小減少了約 30 倍。我們是如何完成的呢?
在第一種情況,使用單階段構建,Docker
鏡像中包含了以下內容。
- golang:1.19-alpine -- 345.93 MB
- source size -- 11.1 KB
- 編譯后的應用程序大小 -- 6.5 MB
在第二種情況,我們先編譯并構建了應用程序,然后將已經編譯的結果復制到最后一個階段。
- alpine size:3 -- 5.54 MB
- 編譯后的應用程序大小 -- 6.5 MB
是否可以再減小 Docker 鏡像的大小?
答案是:能。但為此我們需要使用 Docker Scratch -- 它是一個 0 MB 的 Docker
鏡像。
FROM golang:1.19-alpine as builder WORKDIR /build COPY go.mod . RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -o /main main.go FROM scratch COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY --from=builder main /bin/main ENTRYPOINT ["/bin/main"]
完成后,我們的鏡像大小為 6.66 MB。
原文鏈接:https://juejin.cn/post/7133528305512218637
相關推薦
- 2022-09-27 Android實現密碼隱藏和顯示_Android
- 2021-11-09 C++11?thread多線程編程創建方式_C 語言
- 2022-07-06 C語言超細致講解函數遞歸_C 語言
- 2023-04-29 Linux?grep?-q用法示例詳解_linux shell
- 2023-03-25 Python?Flask-Login模塊使用案例詳解_python
- 2022-05-13 系統分區卷GUID
- 2022-06-16 Rancher+Docker+SpringBoot實現微服務部署、擴容、環境監控_docker
- 2022-10-16 Flask快速實現分頁效果示例_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支