編寫 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 通常遵循以下步驟
- 確定您的基映象
- 安裝應用程式依賴項
- 複製任何相關的原始碼和/或二進位制檔案
- 配置最終映象
在本快速實踐指南中,您將編寫一個 Dockerfile 來構建一個簡單的 Node.js 應用程式。如果您不熟悉基於 JavaScript 的應用程式,請不要擔心。遵循本指南不需要您瞭解它。
設定
下載此 ZIP 檔案並將其內容解壓到您機器上的目錄中。
建立 Dockerfile
現在您已經有了專案,您可以建立 Dockerfile 了。
下載並安裝 Docker Desktop。
在與
package.json檔案相同的資料夾中建立一個名為Dockerfile的檔案。Dockerfile 副檔名
重要的是要注意
Dockerfile沒有副檔名。一些編輯器會自動為檔案新增副檔名(或抱怨它沒有副檔名)。在
Dockerfile中,使用以下行定義您的基映象FROM node:20-alpine現在,使用
WORKDIR指令定義工作目錄。這將指定未來命令將在何處執行以及將檔案複製到容器映象中的目錄。WORKDIR /usr/local/app使用
COPY指令將您機器上的專案中的所有檔案複製到容器映象中COPY . .使用
yarnCLI 和包管理器安裝應用程式的依賴項。為此,使用RUN指令執行一個命令RUN yarn install --production最後,使用
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 並學習了基礎知識,現在該學習構建、標記和推送映象了。