編寫 Dockerfile

說明

Dockerfile 是一種基於文字的檔案,用於建立容器映像檔。它為映像檔建置器提供指令,包含要執行的命令、要複製的檔案、啟動命令等等。

舉例來說,以下 Dockerfile 將產生一個可立即執行的 Python 應用程式

FROM python:3.13
WORKDIR /usr/local/app

# Install the application dependencies
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# Copy in the source code
COPY src ./src
EXPOSE 5000

# Setup an app user so the container doesn't run as the root user
RUN useradd app
USER app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

常用指令

Dockerfile 中最常見的一些指令包括

  • FROM <image> - 指定建置將會擴充的基礎映像檔。
  • WORKDIR <path> - 指定「工作目錄」,即映像檔中將會複製檔案及執行指令的路徑。
  • COPY <host-path> <image-path> - 告訴建置器將檔案從主機複製到容器映像檔中。
  • RUN <command> - 告訴建置器執行指定的命令。
  • ENV <name> <value> - 設定執行中的容器將使用的環境變數。
  • EXPOSE <port-number> - 在映像檔上設定配置,指出該映像檔想要公開的通訊埠。
  • USER <user-or-uid> - 為後續的所有指令設定預設使用者。
  • CMD ["<command>", "<arg1>"] - 設定使用此映像檔的容器啟動時執行的預設命令。

若要閱讀所有指令或深入了解,請查看 Dockerfile 參考文件

試試看

正如您在上一個範例中看到的,Dockerfile 通常遵循以下步驟

  1. 確定您的基礎映像檔
  2. 安裝應用程式相依性
  3. 複製任何相關的原始程式碼及/或二進位檔
  4. 配置最終的映像檔

在本快速實作指南中,您將編寫一個 Dockerfile 來建置一個簡單的 Node.js 應用程式。如果您不熟悉基於 JavaScript 的應用程式,請別擔心,這對於跟隨本指南並非必要。

設定

下載此 ZIP 檔案 並將內容解壓縮到您機器上的資料夾中。

如果您不想下載 ZIP 檔案,也可以複製 https://github.com/docker/getting-started-todo-app 專案並切換到 build-image-from-scratch 分支。

建立 Dockerfile

現在您已經有了專案,準備好建立 Dockerfile 了。

  1. 下載並安裝 Docker Desktop。

  2. 在與 package.json 檔案相同的資料夾中,建立一個名為 Dockerfile 的檔案。

    Dockerfile 檔案副檔名

    請注意,Dockerfile 沒有任何副檔名。有些編輯器會自動為該檔案新增副檔名(或因為沒有副檔名而發出警告)。

  3. Dockerfile 中,透過新增以下行來定義您的基礎映像檔

    FROM node:22-alpine
  4. 現在,使用 WORKDIR 指令定義工作目錄。這將指定未來指令執行的位置,以及檔案將被複製到容器映像檔內的位置。

    WORKDIR /app
  5. 使用 COPY 指令將您機器上專案的所有檔案複製到容器映像檔中

    COPY . .
  6. 使用 yarn CLI 和套件管理器安裝應用程式的相依性。為此,請使用 RUN 指令執行命令

    RUN yarn install --production
  7. 最後,使用 CMD 指令指定要執行的預設命令

    CMD ["node", "./src/index.js"]

    這樣,您應該就會得到以下 Dockerfile

    FROM node:22-alpine
    WORKDIR /app
    COPY . .
    RUN yarn install --production
    CMD ["node", "./src/index.js"]

此 Dockerfile 尚未達到生產環境標準

請注意,此 Dockerfile 尚未(刻意地)遵循所有最佳實踐。它雖然能建置應用程式,但建置速度可能不夠快,映像檔也不夠安全。

繼續閱讀以了解如何讓映像檔最大化利用建置快取、以非 root 使用者身分執行,以及多階段建置。

使用 docker init 快速將新專案容器化

docker init 命令將分析您的專案並快速建立 Dockerfile、compose.yaml.dockerignore,幫助您快速上手。由於您在此處專門學習 Dockerfile,因此暫時不會使用它。但您可以在此處深入了解

其他資源

若要了解更多關於撰寫 Dockerfile 的資訊,請造訪以下資源

下一步

現在您已經建立了 Dockerfile 並學習了基礎知識,是時候學習如何建置、標記 (tag) 及推送映像檔了。

建置、標記並發布映像檔
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.