Docker系列之Dockerfile详解ENV|ARG|VOLUME(六)

网友投稿 271 2022-10-19

Docker系列之Dockerfile详解ENV|ARG|VOLUME(六)

ENV 设置环境变量

1、格式

​​ENV ​​​​ENV = =...​​

2、作用

这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 ​​RUN​​,还是运行时的应用,都可以直接使用这里定义的环境变量。

ENV VERSION=1.0 DEBUG=on \ NAME="Happy Feet"复制代码

这个例子中演示了如何换行,以及对含有空格的值用双引号括起来的办法,这和 Shell 下的行为是一致的。

定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。比如在官方 ​​node​​​ 镜像 ​​Dockerfile​​ 中,就有类似这样的代码:

ENV NODE_VERSION 7.2.0RUN curl -SLO "\ && curl -SLO "\ && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ && grep " node-v$NODE_VERSION-linux-x64.tar.xz$" SHASUMS256.txt | sha256sum -c - \ && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ && ln -s /usr/local/bin/node /usr/local/bin/nodejs复制代码

在这里先定义了环境变量 ​​NODE_VERSION​​​,其后的 ​​RUN​​​ 这层里,多次使用 ​​$NODE_VERSION​​​ 来进行操作定制。可以看到,将来升级镜像构建版本的时候,只需要更新 ​​7.2.0​​​ 即可,​​Dockerfile​​ 构建维护变得更轻松了。

下列指令可以支持环境变量展开: ​​ADD​​​、​​COPY​​​、​​ENV​​​、​​EXPOSE​​​、​​FROM​​​、​​LABEL​​​、​​USER​​​、​​WORKDIR​​​、​​VOLUME​​​、​​STOPSIGNAL​​​、​​ONBUILD​​​、​​RUN​​。

可以从这个指令列表里感觉到,环境变量可以使用的地方很多,很强大。通过环境变量,我们可以让一份 ​​Dockerfile​​ 制作更多的镜像,只需使用不同的环境变量即可。

ARG 构建参数

1、格式

​​ARG <参数名>[=<默认值>]​​

2、作用

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

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

在 1.13 之前的版本,要求 ​​--build-arg​​​ 中的参数名,必须在 ​​Dockerfile​​​ 中用 ​​ARG​​​ 定义过了,换句话说,就是 ​​--build-arg​​​ 指定的参数,必须在 ​​Dockerfile​​​ 中使用了。如果对应参数没有被使用,则会报错退出构建。从 1.13 开始,这种严格的限制被放开,不再报错退出,而是显示警告信息,并继续构建。这对于使用 CI 系统,用同样的构建流程构建不同的 ​​Dockerfile​​ 的时候比较有帮助,避免构建命令必须根据每个 Dockerfile 的内容修改。

VOLUME 定义匿名卷

1、格式

​​VOLUME ["<路径1>", "<路径2>"...]​​​​VOLUME <路径>​​

2、作用

容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,后面的章节我们会进一步介绍 Docker 卷的概念。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 ​​Dockerfile​​ 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

VOLUME /data复制代码

这里的 ​​/data​​​ 目录就会在运行时自动挂载为匿名卷,任何向 ​​/data​​ 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。当然,运行时可以覆盖这个挂载设置。比如:

docker run -d -v mydata:/data xxxx复制代码

在这行命令中,就使用了 ​​mydata​​​ 这个命名卷挂载到了 ​​/data​​​ 这个位置,替代了 ​​Dockerfile​​ 中定义的匿名卷的挂载配置。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java多线程之如何确定线程数的方法
下一篇:Docker系列之Dockerfile详解CMD|ENTRYPOINT(五)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~