初學者在撰寫 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
Kiki的沙龍
10會員
115內容數
心繫正體中文的科學家,立志使用正體中文撰寫文章。 此沙龍預計涵蓋各項資訊科技知識分享與學習心得
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
前言 大家好上次我們教了如何下載 Docker Image 使用,今天我們要教如何產出自己的 Image,這次會使用一個 Dockerfile 範例,自行打包 Docker Image,初步練習使用 Docker 指令 下載 Dockerfile 教學檔案 在這裡我已經幫忙寫好一個 Docke
Thumbnail
前言 大家好上次我們教了如何下載 Docker Image 使用,今天我們要教如何產出自己的 Image,這次會使用一個 Dockerfile 範例,自行打包 Docker Image,初步練習使用 Docker 指令 下載 Dockerfile 教學檔案 在這裡我已經幫忙寫好一個 Docke
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
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 的功用與好處,今天我們要在講解,如何安裝 Docker 這個容器,讓我們在之後的教學應用更好的實作與練習,現在讓我們開始吧 Docker Engine 與 Docker Desktop 首先在講解怎麼安裝 Docker 時,我們先講解 Docker Engin
Thumbnail
前言 上次我們講到 Docker 的功用與好處,今天我們要在講解,如何安裝 Docker 這個容器,讓我們在之後的教學應用更好的實作與練習,現在讓我們開始吧 Docker Engine 與 Docker Desktop 首先在講解怎麼安裝 Docker 時,我們先講解 Docker Engin
Thumbnail
Docker是由GO語言實現,是一個在GitHub上開發原始碼的專案。它的目標是實現羽量級的作業系統虛擬化。讓使用者操作Docker,就像是操作一個羽量級的虛擬機器。 優勢 快速發表和部署 高效的部署和擴充 資源使用率高 管理簡單 核心 Image映像檔 Docker
Thumbnail
Docker是由GO語言實現,是一個在GitHub上開發原始碼的專案。它的目標是實現羽量級的作業系統虛擬化。讓使用者操作Docker,就像是操作一個羽量級的虛擬機器。 優勢 快速發表和部署 高效的部署和擴充 資源使用率高 管理簡單 核心 Image映像檔 Docker
Thumbnail
前言 大家好在先前我們講了什麼是 Docker,Docker 好處有什麼以及怎麼安裝 Docker,今天我們要來開始初體驗 Docker 容器,使用後您會發現 Docker 非常的方便快速 Docker Hub 介紹 首先在開始學怎麼抓取 Docker Image 之前,我們要先來介紹 Doc
Thumbnail
前言 大家好在先前我們講了什麼是 Docker,Docker 好處有什麼以及怎麼安裝 Docker,今天我們要來開始初體驗 Docker 容器,使用後您會發現 Docker 非常的方便快速 Docker Hub 介紹 首先在開始學怎麼抓取 Docker Image 之前,我們要先來介紹 Doc
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 Image,今天我們要來教怎麼把自己做好的 Docker Image 上傳到 Docker Hub,如果以後自己在公司有搭建 Docker Registry,也可以用同樣方式上傳到公司的 Docker Registry 私有倉庫 登入 Doc
Thumbnail
前言 大家好上次我們教了如何建立自己的 Docker Image,今天我們要來教怎麼把自己做好的 Docker Image 上傳到 Docker Hub,如果以後自己在公司有搭建 Docker Registry,也可以用同樣方式上傳到公司的 Docker Registry 私有倉庫 登入 Doc
Thumbnail
前言 上次我們初步體驗 Docker 快速佈署能力,今天我們要來講解 Dockerfile、Docker Image 與 Docker Container 這些常見的名詞,我們來了解在我們佈署的時候做哪些事情 Docker 佈署流程 首先看到如下圖上半部,在我們一個完整的佈署流程,我們會先將我
Thumbnail
前言 上次我們初步體驗 Docker 快速佈署能力,今天我們要來講解 Dockerfile、Docker Image 與 Docker Container 這些常見的名詞,我們來了解在我們佈署的時候做哪些事情 Docker 佈署流程 首先看到如下圖上半部,在我們一個完整的佈署流程,我們會先將我
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News