2021-03-07 15:29:05 +08:00
|
|
|
|
# ARG 构建参数
|
2016-11-26 02:02:43 +08:00
|
|
|
|
|
|
|
|
|
格式:`ARG <参数名>[=<默认值>]`
|
|
|
|
|
|
2017-02-18 21:02:39 +08:00
|
|
|
|
构建参数和 `ENV` 的效果一样,都是设置环境变量。所不同的是,`ARG` 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 `ARG` 保存密码之类的信息,因为 `docker history` 还是可以看到所有值的。
|
2016-11-26 02:02:43 +08:00
|
|
|
|
|
2016-11-28 07:53:44 +08:00
|
|
|
|
`Dockerfile` 中的 `ARG` 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 `docker build` 中用 `--build-arg <参数名>=<值>` 来覆盖。
|
|
|
|
|
|
2021-03-11 23:09:37 +08:00
|
|
|
|
灵活的使用 `ARG` 指令,能够在不修改 Dockerfile 的情况下,构建出不同的镜像。
|
2020-09-06 20:16:04 +08:00
|
|
|
|
|
|
|
|
|
ARG 指令有生效范围,如果在 `FROM` 指令之前指定,那么只能用于 `FROM` 指令中。
|
|
|
|
|
|
|
|
|
|
```docker
|
|
|
|
|
ARG DOCKER_USERNAME=library
|
|
|
|
|
|
|
|
|
|
FROM ${DOCKER_USERNAME}/alpine
|
|
|
|
|
|
|
|
|
|
RUN set -x ; echo ${DOCKER_USERNAME}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
使用上述 Dockerfile 会发现无法输出 `${DOCKER_USERNAME}` 变量的值,要想正常输出,你必须在 `FROM` 之后再次指定 `ARG`
|
|
|
|
|
|
|
|
|
|
```docker
|
|
|
|
|
# 只在 FROM 中生效
|
|
|
|
|
ARG DOCKER_USERNAME=library
|
|
|
|
|
|
|
|
|
|
FROM ${DOCKER_USERNAME}/alpine
|
|
|
|
|
|
|
|
|
|
# 要想在 FROM 之后使用,必须再次指定
|
|
|
|
|
ARG DOCKER_USERNAME=library
|
|
|
|
|
|
|
|
|
|
RUN set -x ; echo ${DOCKER_USERNAME}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
对于多阶段构建,尤其要注意这个问题
|
|
|
|
|
|
|
|
|
|
```docker
|
|
|
|
|
# 这个变量在每个 FROM 中都生效
|
|
|
|
|
ARG DOCKER_USERNAME=library
|
|
|
|
|
|
|
|
|
|
FROM ${DOCKER_USERNAME}/alpine
|
|
|
|
|
|
|
|
|
|
RUN set -x ; echo 1
|
|
|
|
|
|
|
|
|
|
FROM ${DOCKER_USERNAME}/alpine
|
|
|
|
|
|
|
|
|
|
RUN set -x ; echo 2
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
对于上述 Dockerfile 两个 `FROM` 指令都可以使用 `${DOCKER_USERNAME}`,对于在各个阶段中使用的变量都必须在每个阶段分别指定:
|
|
|
|
|
|
|
|
|
|
```docker
|
|
|
|
|
ARG DOCKER_USERNAME=library
|
|
|
|
|
|
|
|
|
|
FROM ${DOCKER_USERNAME}/alpine
|
|
|
|
|
|
|
|
|
|
# 在FROM 之后使用变量,必须在每个阶段分别指定
|
|
|
|
|
ARG DOCKER_USERNAME=library
|
|
|
|
|
|
|
|
|
|
RUN set -x ; echo ${DOCKER_USERNAME}
|
|
|
|
|
|
|
|
|
|
FROM ${DOCKER_USERNAME}/alpine
|
|
|
|
|
|
|
|
|
|
# 在FROM 之后使用变量,必须在每个阶段分别指定
|
|
|
|
|
ARG DOCKER_USERNAME=library
|
|
|
|
|
|
|
|
|
|
RUN set -x ; echo ${DOCKER_USERNAME}
|
|
|
|
|
```
|