ARG 构建参数

格式:ARG <参数名>[=<默认值>]

构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。

Dockerfile 中的 ARG 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖。

灵活的使用 ARG 指令,能够在不修改 Dockerfile 的情况下,构建出不同的镜像。

ARG 指令有生效范围,如果在 FROM 指令之前指定,那么只能用于 FROM 指令中。

  1. ARG DOCKER_USERNAME=library
  2. FROM ${DOCKER_USERNAME}/alpine
  3. RUN set -x ; echo ${DOCKER_USERNAME}

使用上述 Dockerfile 会发现无法输出 ${DOCKER_USERNAME} 变量的值,要想正常输出,你必须在 FROM 之后再次指定 ARG

  1. # 只在 FROM 中生效
  2. ARG DOCKER_USERNAME=library
  3. FROM ${DOCKER_USERNAME}/alpine
  4. # 要想在 FROM 之后使用,必须再次指定
  5. ARG DOCKER_USERNAME=library
  6. RUN set -x ; echo ${DOCKER_USERNAME}

对于多阶段构建,尤其要注意这个问题

  1. # 这个变量在每个 FROM 中都生效
  2. ARG DOCKER_USERNAME=library
  3. FROM ${DOCKER_USERNAME}/alpine
  4. RUN set -x ; echo 1
  5. FROM ${DOCKER_USERNAME}/alpine
  6. RUN set -x ; echo 2

对于上述 Dockerfile 两个 FROM 指令都可以使用 ${DOCKER_USERNAME},对于在各个阶段中使用的变量都必须在每个阶段分别指定:

  1. ARG DOCKER_USERNAME=library
  2. FROM ${DOCKER_USERNAME}/alpine
  3. # 在FROM 之后使用变量,必须在每个阶段分别指定
  4. ARG DOCKER_USERNAME=library
  5. RUN set -x ; echo ${DOCKER_USERNAME}
  6. FROM ${DOCKER_USERNAME}/alpine
  7. # 在FROM 之后使用变量,必须在每个阶段分别指定
  8. ARG DOCKER_USERNAME=library
  9. RUN set -x ; echo ${DOCKER_USERNAME}