編寫 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 並學習了基礎知識,是時候瞭解如何構建、標記和推送映象了。

構建、標記和釋出映象