Dockerfile 主要指令及引數:
指令 | 主要引數 | 作用 | 用法示例 |
---|---|---|---|
FROM | <image>[:<tag>] [AS <name>] | 指定基礎映象 | FROM ubuntu:24.04 AS base |
RUN | <command> 或 ["executable", "param1", "param2"] | 執行命令,通常用於安裝軟體包 | RUN apt-get update && apt-get install -y python3 |
CMD | <command> 或 ["executable","param1","param2"] | 指定容器啟動時執行的命令 | CMD ["python3", "app.py"] |
LABEL | <key>=<value> | 為映象新增後設資料 | LABEL version="1.0" description="This is my app" |
EXPOSE | <port>[/<protocol>] | 宣告容器執行時監聽的埠 | EXPOSE 80/tcp |
ENV | <key>=<value> | 設定環境變數 | ENV NODE_ENV production |
ADD | <src>... <dest> | 複製檔案,支援URL和自動解壓 | ADD https://example.com/big.tar.xz /usr/src/things/ |
COPY | [--chown=<user>:<group>] <src>... <dest> | 複製檔案或目錄 | COPY --chown=user:group files* /data/ |
ENTRYPOINT | ["executable", "param1", "param2"] | 設定容器的入口點,通常與CMD結合使用 | ENTRYPOINT ["nginx", "-g", "daemon off;"] |
VOLUME | ["/data"] | 建立掛載點,用於持久化資料 | VOLUME ["/var/log/"] |
USER | <user>[:<group>] | 指定執行容器時的使用者名稱或UID | USER www-data |
WORKDIR | /path/to/workdir | 設定工作目錄 | WORKDIR /app |
ARG | <name>[=<default value>] | 定義構建引數,可以在構建時傳遞 | ARG VERSION=latest |
ONBUILD | INSTRUCTION | 為映象新增觸發器,執行特定命令 | ONBUILD RUN /usr/local/bin/python-build --dir /app/src |
STOPSIGNAL | signal | 設定停止容器的系統呼叫訊號 | STOPSIGNAL SIGTERM |
HEALTHCHECK | [OPTIONS] CMD command | 定義容器健康檢查 | `HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ |
SHELL | ["executable", "parameters"] | 覆蓋預設shell | SHELL ["/bin/bash", "-c"] |
COPY --from | 從多階段構建中複製檔案 | COPY --from=builder /app /app | |
RUN --mount | 在構建時掛載目錄或快取 | RUN --mount=type=cache,target=/root/.cache pip install -r requirements.txt |
額外的引數和選項:
-
COPY和ADD指令:
--chown=\<user\>:\<group\>
--chmod=\<permissions>
--from=\<name|index>
-
RUN指令:
--mount=type=\<type>,target=\<path>,source=\<source>
--network=\<network>
--security=\<security-opt>
-
HEALTHCHECK指令選項:
--interval=DURATION
(預設: 30s)--timeout=DURATION
(預設: 30s)--start-period=DURATION
(預設: 0s)--retries=N
(預設: 3)
-
ARG指令:
- 可以在FROM指令之前使用,影響基礎映象的選擇
-
多階段構建相關:
FROM \<image\> AS \<stage>
COPY --from=\<stage\> \<src\> \<dest>
Dockerfile樣例:
> #### 注意:此檔案僅用於參考,不要直接使用
# 語法版本宣告
# syntax=docker/dockerfile:1
# 定義構建引數
ARG BASE_IMAGE=ubuntu:24.04
# 指定基礎映象
FROM ${BASE_IMAGE} AS base
# 設定維護者資訊(已棄用,使用LABEL代替)
MAINTAINER John Doe <john.doe@example.com>
# LABEL新增後設資料
# 代替MAINTAINER
LABEL org.opencontainers.image.authors="John Doe <john@example.com>"
LABEL version="1.0" description="這是一個示例Dockerfile"
# 設定環境變數
ENV APP_HOME=/app \
NODE_ENV=production
# 設定工作目錄
WORKDIR ${APP_HOME}
# 複製檔案到映象中
COPY --chown=node:node . .
# 新增遠端檔案到映象中
ADD https://example.com/big.tar.xz /tmp/
# 執行命令
RUN apt-get update && apt-get install -y python3 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 使用掛載執行命令(需要BuildKit支援)
RUN --mount=type=cache,target=/root/.cache \
pip install -r requirements.txt
# 暴露埠
EXPOSE 8080
# 建立資料卷
VOLUME ["/data"]
# 設定預設使用者
USER node
# 定義健康檢查
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost:8080/ || exit 1
# 設定容器啟動時執行的命令
ENTRYPOINT ["node"]
# 設定預設命令
CMD ["app.js"]
# 設定停止訊號
STOPSIGNAL SIGTERM
# 更改預設shell
SHELL ["/bin/bash", "-c"]
# 多階段構建:新階段
FROM base AS production
# 為子映象新增觸發器指令
ONBUILD RUN echo "This is triggered when used as a base image"
# 從之前階段複製檔案
COPY --from=base ${APP_HOME} ${APP_HOME}
> AI提醒構建Dockerfile時要注意的問題:
> - 某些指令(如HEALTHCHECK和RUN --mount)
需要較新版本的Docker或特定的構建器(如BuildKit)才能使用。
> - 在實際使用中,您通常不會在一個Dockerfile中使用所有這些指令。應該根據專案需求選擇適當的指令。
> - 指令的順序很重要,特別是像FROM、ARG、ENV
這樣的指令,它們會影響後續指令的行為。
> - 多階段構建(在此示例中使用FROM ... AS ...
)是一種最佳化映象大小和提高安全性的高階技術。
> - MAINTAINER
指令已被棄用,建議使用LABEL
來新增維護者資訊。
參考:
[1] https://docs.docker.com/reference/dockerfile/
[2] https://docs.docker.com/build/concepts/dockerfile/