學習 Dockerfile 常用指令
在構建 Docker 鏡像時,Dockerfile
文件是一份至關重要的配置文件,它定義了構建鏡像的所有步驟。通過在 Dockerfile
中使用不同的指令(命令),我們可以控制鏡像的構建過程、設置環境、指定執行命令等。本文將為你詳細介紹 Dockerfile 中常用的指令及其用途,幫助你更好地理解和使用 Docker。
1. FROM
FROM
是 Dockerfile 中最基本的指令,它指定了基礎鏡像,所有的 Docker 鏡像都需要從某個基礎鏡像開始構建。
- 作用:指定基礎鏡像。
- 語法:
FROM <image-name>:<tag>
- 示例:
解釋:這個指令表示使用FROM node:20-slim
node:20-slim
作為基礎鏡像。
2. RUN
RUN
指令用于在鏡像構建時執行命令。它可以用來安裝軟件包、運行腳本等,常用于配置和安裝依賴。
- 作用:在鏡像構建時執行命令。
- 語法:
RUN <command>
- 示例:
解釋:該指令更新包管理器并安裝RUN apt-get update && apt-get install -y curl
curl
。
3. CMD
CMD
指令指定容器啟動時執行的默認命令。如果用戶沒有在運行容器時指定其他命令,Docker 將執行 CMD
中定義的命令。
- 作用:指定容器啟動時的默認命令。
- 語法:
或者CMD ["executable", "param1", "param2"]
CMD command param1 param2
- 示例:
解釋:如果用戶未指定其他命令,容器啟動時將執行CMD ["node", "server.js"]
node server.js
。
4. ENTRYPOINT
ENTRYPOINT
和 CMD
類似,但具有更強的控制力。無論你傳遞什么命令給 docker run
,ENTRYPOINT
定義的命令都會被執行。CMD
可以用來提供默認參數。
- 作用:指定容器啟動時始終執行的命令。
- 語法:
ENTRYPOINT ["executable", "param1", "param2"]
- 示例:
解釋:容器啟動時始終執行ENTRYPOINT ["node", "server.js"]
node server.js
,無論傳入什么命令行參數。
5. WORKDIR
WORKDIR
指令用于設置容器中的工作目錄,所有后續的命令(如 RUN
、CMD
)都將在該目錄下執行。
- 作用:設置工作目錄。
- 語法:
WORKDIR <path>
- 示例:
解釋:將工作目錄設置為WORKDIR /app
/app
,后續的操作會在此目錄下進行。
6. COPY
COPY
指令用于將文件或目錄從主機復制到容器的指定位置。
- 作用:復制本地文件或目錄到容器中。
- 語法:
COPY <source> <destination>
- 示例:
解釋:將當前目錄(主機中的COPY . /app
.
)復制到容器中的/app
目錄。
7. ADD
ADD
指令類似于 COPY
,但功能更強大,支持從 URL 下載文件并自動解壓文件。
- 作用:將本地文件或遠程文件復制到容器,并且支持解壓。
- 語法:
ADD <source> <destination>
- 示例:
解釋:該指令將壓縮包ADD ./config.tar.gz /app/config/
config.tar.gz
解壓到容器中的/app/config/
目錄。
8. ENV
ENV
指令用于設置環境變量,這些變量會在容器的整個生命周期中可用。
- 作用:設置環境變量。
- 語法:
ENV <key>=<value>
- 示例:
解釋:設置環境變量ENV NODE_ENV production
NODE_ENV
為production
,后續的命令或運行時都能訪問到這個環境變量。
9. EXPOSE
EXPOSE
指令用于聲明容器監聽的端口,通常用于文檔說明,告訴其他開發者容器會監聽哪些端口。它不會實際打開端口。
- 作用:聲明容器暴露的端口。
- 語法:
EXPOSE <port>
- 示例:
解釋:聲明容器會監聽端口EXPOSE 3000
3000
,容器在運行時,可以通過docker run -p
映射到主機端口。
10. VOLUME
VOLUME
指令用于創建一個掛載點,可以將宿主機的目錄或 Docker 卷掛載到容器中,以便數據持久化。
- 作用:定義容器掛載點,持久化數據。
- 語法:
VOLUME ["/path"]
- 示例:
解釋:創建一個名為VOLUME ["/data"]
/data
的掛載點,可以將容器中的數據持久化。
11. USER
USER
指令用于指定在容器中運行后續命令的用戶,通常為了安全考慮,避免以 root
用戶運行容器。
- 作用:指定容器內運行命令的用戶。
- 語法:
USER <username>
- 示例:
解釋:后續命令將以USER node
node
用戶身份執行。
12. HEALTHCHECK
HEALTHCHECK
指令定義容器的健康檢查命令。Docker 會周期性地執行這個命令來檢查容器是否運行正常。
- 作用:定義健康檢查命令。
- 語法:
HEALTHCHECK CMD <command>
- 示例:
解釋:容器會定期執行HEALTHCHECK CMD curl --fail http://localhost:3000/health || exit 1
curl
命令來檢查應用是否可用。
13. STOPSIGNAL
STOPSIGNAL
指令用于定義容器停止時發送的信號,默認情況下是 SIGTERM
。
- 作用:定義停止容器時的信號。
- 語法:
STOPSIGNAL <signal>
- 示例:
解釋:當容器停止時,Docker 將發送STOPSIGNAL SIGKILL
SIGKILL
信號,而不是默認的SIGTERM
。
14. ARG
ARG
指令用于定義構建時的變量,它的作用范圍僅限于構建階段。
- 作用:定義構建時的變量。
- 語法:
ARG <name>[=<default value>]
- 示例:
解釋:定義ARG NODE_VERSION=20 FROM node:${NODE_VERSION}-slim
NODE_VERSION
變量,并在FROM
中使用該變量。
總結
指令 | 作用 | 執行時機 |
---|---|---|
FROM | 指定鏡像基礎 | 構建時 |
RUN | 執行命令,生成中間鏡像 | 構建時 |
CMD | 容器啟動時的默認命令 | 容器運行時 |
ENTRYPOINT | 容器啟動時強制執行的命令 | 容器運行時 |
WORKDIR | 指定工作目錄 | 構建+運行時 |
COPY | 復制本地文件 | 構建時 |
ADD | 復制或解壓本地/URL 文件 | 構建時 |
ENV | 設置環境變量 | 構建+運行時 |
EXPOSE | 指定要暴露的端口 | 僅用于文檔 |
VOLUME | 定義可掛載的存儲路徑 | 容器運行時 |
USER | 指定運行命令的用戶 | 構建+運行時 |
HEALTHCHECK | 健康檢查 | 容器運行時 |
掌握這些常用指令,可以幫助你更加高效地編寫和管理 Dockerfile,構建出高質量的 Docker 鏡像。希望本文能對你有所幫助,歡迎留言交流!