dockerfile全局变量

二维码
| Dec 25, 2020 | 原创

在使用 dockerfile 进行多阶段构建时,有时候我们希望在多个阶段中复用同一个变量配置,这时候我们可以利用 ARG 来进行全局变量封装。

ARG 默认的生命周期是在一个构建阶段内部。即一个构建阶段定义的 ARG 参数在下一个阶段是无法获取到该变量的。

FROM test:1.0
ARG prj_home=/home/www
...

FROM test:2.0
RUN ls $prj_home

如上 Dockerfile 我们在第一个构建阶段定义了一个 prj_home 变量,我们希望在下一个构建阶段直接复用这个变量,但上述操作会报错,因为 $prj_home 变量的生命周期只属于第一个构建阶段。

那么我们如何在多个构建阶段复用变量呢?我们可以使用如下的方式来解决,直接上代码:

ARG prj_home=/home/www

FROM test:1.0
ARG prj_home
...

FROM test:2.0
ARG prj_home
RUN ls $prj_home

首先我们把 prj_home 变量的定义放在了 FROM 指令之前,然后我们在每个构建阶段再次声明使用这个变量即可(注意:重新声明必不可少)。如此,我们便可以在过个构建阶段复用同一个变量内容。

那么我们延伸思考一下:另一个设置变量指令 ENV 可以达到如上的效果吗? 答案是不可以的,如果你尝试把 ENV 变量放在 FROM 指令之前:

ENV prj_home=/home/www
FROM test:1.0
...

docker build 不会编译成功,会报如下错误:

Sending build context to Docker daemon  4.608kB
Error response from daemon: No build stage in current context