目录

这里主要是了解 Dockerfile 中 ARG 指令的作用范围。

总结

  1. FROM 前定义的参数,只能在 FROM 指令中使用,且能够在多阶段中起作用。
ARG BASE_IMAGE=python:3.10.9
FROM ${BASE_IMAGE} AS builder
...

FROM ${BASE_IMAGE}
...
  1. FROM 后定义的参数,只能作用在本 Stage 阶段。
FROM python:3.10.9 AS builder
ARG APP_HOME=/WALL-E-AI
WORKDIR ${APP_HOME}

FROM python:3.10.9
ARG APP_HOME=/WALL-E-AI
WORKDIR ${APP_HOME}

实验

ARG BASE_IMAGE=python:3.10.9

FROM ${BASE_IMAGE} AS builder

RUN du -sh /usr/lib >> /app.log
RUN echo "🚀 stage-1 范围,在 FROM 指令前定义 ARG BASE_IMAGE: ${BASE_IMAGE}" >> /app.log
RUN echo "🚀 stage-1 范围,未定义 ARG APP_HOME: ${APP_HOME}" >> /app.log

ARG APP_HOME=/WALL-E-AI

RUN echo "🚀 stage-1 范围,定义 ARG APP_HOME: ${APP_HOME}" >> /app.log

WORKDIR ${APP_HOME}


# 发布应用
FROM ${BASE_IMAGE}

COPY --from=builder  /app.log /app.log
RUN du -sh /usr/lib >> /app.log
RUN echo "🟥 stage-2 范围,在 FROM 指令前定义 ARG BASE_IMAGE: ${BASE_IMAGE}" >> /app.log
RUN echo "🟥 stage-2 范围,未定义 ARG APP_HOME: ${APP_HOME}" >> /app.log

ARG APP_HOME=/WALL-E-AI

RUN echo "🟥 stage-2 范围,定义 ARG APP_HOME: ${APP_HOME}" >> /app.log

WORKDIR ${APP_HOME}

RUN cat /app.log

构建镜像,使用默认的参数值。

docker buildx build --progress=plain --platform=linux/amd64 --rm -f Dockerfile -t test:amd64 .
#17 [stage-1 8/8] RUN cat /app.log
#17 0.218 501M  /usr/lib
#17 0.218 🚀 stage-1 范围,在 FROM 指令前定义 ARG BASE_IMAGE: 
#17 0.218 🚀 stage-1 范围,未定义 ARG APP_HOME: 
#17 0.218 🚀 stage-1 范围,定义 ARG APP_HOME: /WALL-E-AI
#17 0.218 501M  /usr/lib
#17 0.218 🟥 stage-2 范围,在 FROM 指令前定义 ARG BASE_IMAGE: 
#17 0.218 🟥 stage-2 范围,未定义 ARG APP_HOME: 
#17 0.218 🟥 stage-2 范围,定义 ARG APP_HOME: /WALL-E-AI
#17 DONE 0.2s

构建镜像,使用指定的参数值。

docker buildx build --progress=plain --platform=linux/arm64 --build-arg BASE_IMAGE=python:3.10.9-slim --build-arg APP_HOME=wall-e-ai --rm -f Dockerfile -t test:arm64 .
#16 [stage-1 8/8] RUN cat /app.log
#16 0.091 38M   /usr/lib
#16 0.091 🚀 stage-1 范围,在 FROM 指令前定义 ARG BASE_IMAGE: 
#16 0.091 🚀 stage-1 范围,未定义 ARG APP_HOME: 
#16 0.091 🚀 stage-1 范围,定义 ARG APP_HOME: wall-e-ai
#16 0.091 38M   /usr/lib
#16 0.091 🟥 stage-2 范围,在 FROM 指令前定义 ARG BASE_IMAGE: 
#16 0.091 🟥 stage-2 范围,未定义 ARG APP_HOME: 
#16 0.091 🟥 stage-2 范围,定义 ARG APP_HOME: wall-e-ai
#16 DONE 0.1s

参考资料