網站首頁 編程語言 正文
引言
多階段構建方式,是在 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
相關推薦
- 2023-01-28 手把手教你用python繪制熱度圖(heatmap)_python
- 2024-03-08 Linux虛擬機輸入ifconfig不顯示IP地址解決方法
- 2022-06-10 在vscode中快速新建html文件的2種方法總結_C 語言
- 2021-11-10 Android?Studio設置繪制布局時的視圖_Android
- 2022-07-14 python重復值處理得方法_python
- 2022-03-30 用C語言實現二分查找算法_C 語言
- 2021-12-06 C語言PlaySound函數使用方法_C 語言
- 2022-01-14 promise封裝小程序api請求
- 最近更新
-
- 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同步修改后的遠程分支