初學者在撰寫 Dockerfile 時應培養的好習慣

更新 發佈閱讀 6 分鐘

前言

先說在前面——你是不是常常隨意地寫 Dockerfile 呢?其實只要稍微用點心思,就能讓映像檔更輕量、可讀性更高。 這次就來介紹幾個實用的小技巧。

一:善用多階段建置(Multi-Stage Build)

Docker 的多階段建置功能,是指在建置過程中將「編譯階段」與「執行階段」分開, 這樣最終的映像檔就能變得更精簡。以下以建立 Go 語言容器為例,來看看這樣做有什麼好處。

錯誤範例

FROM golang:1.25
WORKDIR /app
COPY . .
RUN go build -o myapp .
CMD ["./myapp"]

正確範例

# Stage 1: Build
FROM golang:1.25 AS builder
WORKDIR /app
RUN --mount=type=bind,source=.,target=/src,readonly \
--mount=type=cache,target=/root/.cache/go-build \
--mount=type=cache,target=/go/pkg/mod \
cd /src && go build -o /app/myapp .

# Stage 2: Run
FROM alpine:3.22.1
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]

接著,我們實際來 build 上面這兩個 Dockerfile,看看最終映像檔的容量差異有多大。這裡先用一個簡單的架構:由 main.gogo.mod 所組成的 Go 應用程式作為例子。實際 build 之後比較結果,竟然相差 80 倍!這次雖然只是用一個很小的範例來測試,但差距已經這麼大了。 若在實際專案中完整使用,差距恐怕會更驚人。

test@mymac senior % docker image ls | grep myapp
myapp-senior latest 953f175978a5 13 seconds ago 16.9MB
myapp-junior latest 8a57b08592c6 32 seconds ago 1.3GB
test@mymac senior %

二:一定要固定 Base Image 的版本

錯誤範例

FROM golang:latest

正確範例

FROM golang:1.25-alpine

如果忽略這點,今天能 build 的專案,明天可能就突然無法 build 了。今天這樣寫可以正常 build,但如果明天 latest 被更新了會怎樣呢? 你的 build 很可能突然就會失敗。

重點如下:

  • 指定 LTS 的特定版本號(例如 1.23
  • 若可能,使用輕量版映像(例如 alpinebullseye-slim

這樣不僅能避免預期外的問題,也能減少映像大小。實際上可縮小約 4 倍

三:盡量減少 Layer 數量

下一個重點是「盡可能減少層數(Layer)」。這麼做有以下好處:

  • 減少映像檔大小(不殘留多餘檔案)
  • 提升快取效率(縮短重建時間)
  • 加快部署速度(層數越少,push/pull 越快)

四:善用 .dockerignore

.dockerignore 的用途和 .gitignore 類似,可以指定哪些檔案不應該被打包進映像中。

五:建立具安全意識的 Dockerfile

Docker 安全性最佳實務可歸納為以下四點:

  1. 使用 可信且輕量的 Base Image
  2. 採用 多階段建置
  3. 定期重新建置 映像
  4. 檢查映像的漏洞


使用可信的 Base Image

Docker Hub 上有非常多映像,但應優先選擇:

  • Official Image(官方映像)
  • Verified Publisher(官方驗證發佈者)

這些映像在名稱旁會有官方標誌。此外,盡量選擇小型映像(如 alpineslim),可降低攻擊面與漏洞風險。


採用多階段建置

如前所述,利用多階段建置可確保最終映像中不含不必要的工具與檔案,進而避免潛在漏洞並減少攻擊面。

定期重新建置映像

若長期使用多年未更新的映像,即使原軟體後來修補了漏洞,你的映像仍會保留舊漏洞。建議定期重新建置。


結論

以下是本文介紹的五個重點: 活用多階段建置 → 讓映像更輕量、移除不必要依賴 固定 Base Image 版本 → 提高重現性、避免意外失敗 減少 Layer 數量 → 提升快取效率與建置速度 善用 .dockerignore → 避免打包無關檔案 強化安全性意識 → 使用可信映像、定期更新與掃描漏洞

只要在日常開發中多留意這些細節, 你的映像就能更 輕量、快速、安全。 下次撰寫 Dockerfile 時,不妨嘗試實踐其中的一項看看吧。

留言
avatar-img
留言分享你的想法!
avatar-img
Kiki的沙龍
4會員
54內容數
心繫正體中文的科學家,立志使用正體中文撰寫文章。 此沙龍預計涵蓋各項資訊科技知識分享與學習心得
Kiki的沙龍的其他內容
2025/10/30
Google 近日推出的 「Google Skills」,正是為了填補這個技能落差而打造的終極免費學習平台。 本文將說明技術人員與商務人士如何善用這個平台,讓自己的職涯在 AI 時代加速前進。
2025/10/30
Google 近日推出的 「Google Skills」,正是為了填補這個技能落差而打造的終極免費學習平台。 本文將說明技術人員與商務人士如何善用這個平台,讓自己的職涯在 AI 時代加速前進。
2025/10/30
Oracle 發布一款領先業界的綜合平台——「Oracle AI Data Platform, AIDP」,可讓生成式AI 模型安全地連接至企業的資料、應用程式與工作流程。透過自動資料擷取、語義強化、向量索引建立,並與內建的生成式 AI 工具結合加速使用者開發。
Thumbnail
2025/10/30
Oracle 發布一款領先業界的綜合平台——「Oracle AI Data Platform, AIDP」,可讓生成式AI 模型安全地連接至企業的資料、應用程式與工作流程。透過自動資料擷取、語義強化、向量索引建立,並與內建的生成式 AI 工具結合加速使用者開發。
Thumbnail
2025/10/08
在前端開發時,每次遇到 console 錯誤就要去複製、截圖,再交給 AI 處理,真的蠻麻煩的。我自己在本機環境做測試時,每次有錯誤就打開 DevTools 複製錯誤訊息,再貼到 Claude Code……這樣重複操作過很多次。其實使用 Chrome DevTools MCP 就能搞定所有事情。
Thumbnail
2025/10/08
在前端開發時,每次遇到 console 錯誤就要去複製、截圖,再交給 AI 處理,真的蠻麻煩的。我自己在本機環境做測試時,每次有錯誤就打開 DevTools 複製錯誤訊息,再貼到 Claude Code……這樣重複操作過很多次。其實使用 Chrome DevTools MCP 就能搞定所有事情。
Thumbnail
看更多
你可能也想看
Thumbnail
覺得黏在額頭上的"條碼瀏海"很阿雜嗎?日本熱銷的「KOIZUMI迷你瀏海梳」,不僅小巧便攜,更能快速加熱造型,無論是齊瀏海、空氣瀏海還是韓系碎蓋髮,都能輕鬆打理!瀏海順了,一整天心情就好了!
Thumbnail
覺得黏在額頭上的"條碼瀏海"很阿雜嗎?日本熱銷的「KOIZUMI迷你瀏海梳」,不僅小巧便攜,更能快速加熱造型,無論是齊瀏海、空氣瀏海還是韓系碎蓋髮,都能輕鬆打理!瀏海順了,一整天心情就好了!
Thumbnail
走完朝聖之路和TMB後,我發現真正能撐住長時間健行的,不只是腳力,而是那些讓生活更舒服的小物。這篇整理了我在TMB實測後覺得超好用的三樣登山神器——防水襪、肥皂袋、速乾毛巾,每一樣都讓旅程更輕鬆!
Thumbnail
走完朝聖之路和TMB後,我發現真正能撐住長時間健行的,不只是腳力,而是那些讓生活更舒服的小物。這篇整理了我在TMB實測後覺得超好用的三樣登山神器——防水襪、肥皂袋、速乾毛巾,每一樣都讓旅程更輕鬆!
Thumbnail
Docker-Compose負責對container做快速編排。設定檔預設名稱為docker-compose.yml,在檔案中,可以透過COMPOSE_FILE或-f對設定進行定義。 想要將專案透過Docker-Compose部署,需要創建docker-compose.yml和Dockerfile
Thumbnail
Docker-Compose負責對container做快速編排。設定檔預設名稱為docker-compose.yml,在檔案中,可以透過COMPOSE_FILE或-f對設定進行定義。 想要將專案透過Docker-Compose部署,需要創建docker-compose.yml和Dockerfile
Thumbnail
Docker是由GO語言實現,是一個在GitHub上開發原始碼的專案。它的目標是實現羽量級的作業系統虛擬化。讓使用者操作Docker,就像是操作一個羽量級的虛擬機器。 優勢 快速發表和部署 高效的部署和擴充 資源使用率高 管理簡單 核心 Image映像檔 Docker
Thumbnail
Docker是由GO語言實現,是一個在GitHub上開發原始碼的專案。它的目標是實現羽量級的作業系統虛擬化。讓使用者操作Docker,就像是操作一個羽量級的虛擬機器。 優勢 快速發表和部署 高效的部署和擴充 資源使用率高 管理簡單 核心 Image映像檔 Docker
Thumbnail
前言 大家好上次我們教了如何建立自己的 Docker Image,今天我們要來教怎麼把自己做好的 Docker Image 上傳到 Docker Hub,如果以後自己在公司有搭建 Docker Registry,也可以用同樣方式上傳到公司的 Docker Registry 私有倉庫 登入 Doc
Thumbnail
前言 大家好上次我們教了如何建立自己的 Docker Image,今天我們要來教怎麼把自己做好的 Docker Image 上傳到 Docker Hub,如果以後自己在公司有搭建 Docker Registry,也可以用同樣方式上傳到公司的 Docker Registry 私有倉庫 登入 Doc
Thumbnail
前言 大家好上次我們教了如何下載 Docker Image 使用,今天我們要教如何產出自己的 Image,這次會使用一個 Dockerfile 範例,自行打包 Docker Image,初步練習使用 Docker 指令 下載 Dockerfile 教學檔案 在這裡我已經幫忙寫好一個 Docke
Thumbnail
前言 大家好上次我們教了如何下載 Docker Image 使用,今天我們要教如何產出自己的 Image,這次會使用一個 Dockerfile 範例,自行打包 Docker Image,初步練習使用 Docker 指令 下載 Dockerfile 教學檔案 在這裡我已經幫忙寫好一個 Docke
Thumbnail
前言 上次講到 Dockerfile、DockerImage、Docker Container 他們之間的關係,今天我們要來熟悉 Docker Image 如何使用,教你如何抓取雲端上的 Docker Image, Docker Image 下載來源 當我們今天要要使用 Docker Imag
Thumbnail
前言 上次講到 Dockerfile、DockerImage、Docker Container 他們之間的關係,今天我們要來熟悉 Docker Image 如何使用,教你如何抓取雲端上的 Docker Image, Docker Image 下載來源 當我們今天要要使用 Docker Imag
Thumbnail
前言 上次我們初步體驗 Docker 快速佈署能力,今天我們要來講解 Dockerfile、Docker Image 與 Docker Container 這些常見的名詞,我們來了解在我們佈署的時候做哪些事情 Docker 佈署流程 首先看到如下圖上半部,在我們一個完整的佈署流程,我們會先將我
Thumbnail
前言 上次我們初步體驗 Docker 快速佈署能力,今天我們要來講解 Dockerfile、Docker Image 與 Docker Container 這些常見的名詞,我們來了解在我們佈署的時候做哪些事情 Docker 佈署流程 首先看到如下圖上半部,在我們一個完整的佈署流程,我們會先將我
Thumbnail
前言 大家好在先前我們講了什麼是 Docker,Docker 好處有什麼以及怎麼安裝 Docker,今天我們要來開始初體驗 Docker 容器,使用後您會發現 Docker 非常的方便快速 Docker Hub 介紹 首先在開始學怎麼抓取 Docker Image 之前,我們要先來介紹 Doc
Thumbnail
前言 大家好在先前我們講了什麼是 Docker,Docker 好處有什麼以及怎麼安裝 Docker,今天我們要來開始初體驗 Docker 容器,使用後您會發現 Docker 非常的方便快速 Docker Hub 介紹 首先在開始學怎麼抓取 Docker Image 之前,我們要先來介紹 Doc
Thumbnail
前言 上次我們講到 Docker 的功用與好處,今天我們要在講解,如何安裝 Docker 這個容器,讓我們在之後的教學應用更好的實作與練習,現在讓我們開始吧 Docker Engine 與 Docker Desktop 首先在講解怎麼安裝 Docker 時,我們先講解 Docker Engin
Thumbnail
前言 上次我們講到 Docker 的功用與好處,今天我們要在講解,如何安裝 Docker 這個容器,讓我們在之後的教學應用更好的實作與練習,現在讓我們開始吧 Docker Engine 與 Docker Desktop 首先在講解怎麼安裝 Docker 時,我們先講解 Docker Engin
Thumbnail
前言 上次我們針對 Docker 這樣容器化技術做了一點介紹,今天我們要來講解 Docker 架構,你是否發現在每次程式上伺服器的流程很麻煩呢 ? 是否發現你寫的程式在別的作業系統不能用呢 ? 如果你遇到這些問題,Docker 都可以幫助你解決這些問題 Docker 架構 在 Docker 這
Thumbnail
前言 上次我們針對 Docker 這樣容器化技術做了一點介紹,今天我們要來講解 Docker 架構,你是否發現在每次程式上伺服器的流程很麻煩呢 ? 是否發現你寫的程式在別的作業系統不能用呢 ? 如果你遇到這些問題,Docker 都可以幫助你解決這些問題 Docker 架構 在 Docker 這
Thumbnail
前言 大家好我們今天要來教 Docker 這項技術,什麼是 Docker ? Docker 可以幫助我們做什麼事情 ? Docker 是一項容器化技術,他可以降低我們在佈署 App 時,讓我們可以有效的分配作業系統資源,降低佈署作業成本,現在讓我們來了解 Docker 要解決的問題 傳統佈署遇
Thumbnail
前言 大家好我們今天要來教 Docker 這項技術,什麼是 Docker ? Docker 可以幫助我們做什麼事情 ? Docker 是一項容器化技術,他可以降低我們在佈署 App 時,讓我們可以有效的分配作業系統資源,降低佈署作業成本,現在讓我們來了解 Docker 要解決的問題 傳統佈署遇
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News