閒的蛋疼整理了一下Dockerfile的命令和引數備查

鹰的翅膀让我翱翔發表於2024-09-11

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

額外的引數和選項:

  1. COPY和ADD指令:

    • --chown=\<user\>:\<group\>
    • --chmod=\<permissions>
    • --from=\<name|index>
  2. RUN指令:

    • --mount=type=\<type>,target=\<path>,source=\<source>
    • --network=\<network>
    • --security=\<security-opt>
  3. HEALTHCHECK指令選項:

    • --interval=DURATION (預設: 30s)
    • --timeout=DURATION (預設: 30s)
    • --start-period=DURATION (預設: 0s)
    • --retries=N (預設: 3)
  4. ARG指令:

    • 可以在FROM指令之前使用,影響基礎映象的選擇
  5. 多階段構建相關:

    • 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/

相關文章