撰寫 Dockerfile

說明

Dockerfile 是一個基於文字的文件,用於建立容器映像檔。它向映像檔建構器提供關於要執行的指令、要複製的檔案、啟動指令等的指示。

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

FROM python:3.12
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. 設定最終映像檔

在本快速入門指南中,您將撰寫一個建構簡單 Node.js 應用程式的 Dockerfile。如果您不熟悉基於 JavaScript 的應用程式,請不要擔心。 這對於學習本指南並不是必要的。

設定

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

建立 Dockerfile

現在您已擁有專案,您就可以建立 Dockerfile 了。

  1. 下載並安裝 Docker Desktop。

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

    Dockerfile 副檔名

    需要注意的是,Dockerfile *沒有* 副檔名。某些編輯器會自動將副檔名新增到檔案(或抱怨它沒有副檔名)。

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

    FROM node:20-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:20-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 並學習了基礎知識,接下來該學習如何建構、標記和推送映像檔了。