Dockerfile 是一個文本文件,用於定義如何構建一個 Docker 鏡像。它包含了若干條指令,每一條指令都會在鏡像構建過程中被執行,形成新的鏡像層。通過 docker build 命令讀取並執行 Dockerfile 中的指令序列,最終生成一個新的 Docker 鏡像。
以下是Dockerfile中一些關鍵概念和常用指令詳解:
基礎鏡像(FROM):
Dockerfile 通常以 FROM 指令開始,指定構建新鏡像的基礎鏡像,例如:FROM ubuntu:latest 表示基於 Ubuntu 的最新版本鏡像進行構建。
維護者信息(MAINTAINER)(已廢棄,推薦使用 LABEL):
雖然 MAINTAINER 已不再推薦使用,但可以使用 LABEL 指令設置元數據,如:LABEL maintainer="John Doe <john.doe@example.com>"。
工作目錄(WORKDIR):
設置構建時及容器運行時的工作目錄,例如:WORKDIR /app。
複製文件(COPY)和添加文件(ADD):
COPY 指令從構建上下文目錄中複製文件或目錄到鏡像內部。
ADD 指令類似,但除了複製文件外,還可以自動解壓 tar 壓縮包,並可以從 URL 下載文件。
運行命令(RUN):
在構建鏡像的過程中執行 shell 命令或執行程序,每次 RUN 都會產生一個新的鏡像層。例如:RUN apt-get update && apt-get install -y nginx。
環境變量(ENV):
定義將在構建過程以及容器運行時使用的環境變量,例如:ENV NODE_ENV=production.
暴露端口(EXPOSE):
聲明容器運行時將要監聽的端口號,但這不會在主機上自動創建端口映射,例如:EXPOSE 80 443。
入口點(ENTRYPOINT) 和 默認命令(CMD):
ENTRYPOINT 設定容器啓動後執行的默認可執行程序及其參數,不可被 docker run 命令直接覆蓋(除非使用 --entrypoint 參數),但其後的 CMD 參數會被追加至 ENTRYPOINT 後作為額外參數傳遞。
CMD 則是為容器提供默認的命令和參數,如果在 docker run 時指定了命令,則會覆蓋 CMD 提供的默認值。
健康檢查(HEALTHCHECK):
用於定義一個測試容器服務是否健康的命令,例如:HEALTHCHECK --interval=5m --timeout=3s CMD curl --fail http://localhost/ || exit 1
用户和組(USER、GROUP):
指定鏡像內運行進程的用户和組身份,例如:USER appuser
通過這些指令以及其他更多指令(比如 VOLUME、STOPSIGNAL 等),
開發者能夠詳細地定製化 Docker 鏡像,使其滿足特定的應用需求。在編寫 Dockerfile 時,應遵循最佳實踐,如減少層數、最小化鏡像大小、利用緩存提高構建速度等。