mirror of
https://github.com/yeasy/docker_practice.git
synced 2025-08-05 15:12:31 +00:00
Dockerfile add shell label
Signed-off-by: Kang Huaishuai <khs1994@khs1994.com>
This commit is contained in:
@@ -7,3 +7,62 @@
|
||||
`Dockerfile` 中的 `ARG` 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 `docker build` 中用 `--build-arg <参数名>=<值>` 来覆盖。
|
||||
|
||||
在 1.13 之前的版本,要求 `--build-arg` 中的参数名,必须在 `Dockerfile` 中用 `ARG` 定义过了,换句话说,就是 `--build-arg` 指定的参数,必须在 `Dockerfile` 中使用了。如果对应参数没有被使用,则会报错退出构建。从 1.13 开始,这种严格的限制被放开,不再报错退出,而是显示警告信息,并继续构建。这对于使用 CI 系统,用同样的构建流程构建不同的 `Dockerfile` 的时候比较有帮助,避免构建命令必须根据每个 Dockerfile 的内容修改。
|
||||
|
||||
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}
|
||||
```
|
||||
|
Reference in New Issue
Block a user