docker中arg和env的区别是什么

网友投稿 973 2022-10-10

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

docker中arg和env的区别是什么

docker中arg和env的区别是:arg是在build的时候存在的,可以在Dockerfile中当做变量来使用,而env是容器构建好之后的环境变量,不能在Dockerfile中当参数使用。

本教程操作环境:linux7.3系统、docker-1.13.1版、Dell G3电脑。

docker中arg和env的区别是什么

在使用 docker-compoe 构建镜像的时候会感觉 ARG 和 ENV 的作用很相似, 但是这两个存在就肯定有它的原因

它们起作用的时机

arg 是在 build 的时候存在的, 可以在 Dockerfile 中当做变量来使用env 是容器构建好之后的环境变量, 不能在 Dockerfile 中当参数使用

从这里可以看出来 ARG 就是专门为构建镜像而生的

拿一个具体的例子

# DockerfileFROM redis:3.2-alpineLABEL maintainer="GPF <5173180@qq.com>"ARG REDIS_SET_PASSWORD=developerENV REDIS_PASSWORD ${REDIS_SET_PASSWORD}VOLUME /dataEXPOSE 6379CMD ["sh", "-c", "exec redis-server --requirepass \"$REDIS_PASSWORD\""]

这是一个构建 redis 的文件, 中间有这么一句

ARG REDIS_SET_PASSWORD=developerENV REDIS_PASSWORD ${REDIS_SET_PASSWORD}

它是为

CMD ["sh", "-c", "exec redis-server --requirepass \"$REDIS_PASSWORD\""]

这一句服务的, 这句就是在启动 redis 的时候设置密码, 因为当执行 CMD 的时候,说明容器已经构建成功运行了起来,此时 CMD是在容器中执行容器中的命令, 因此 CMD 中的变量是用的环境变量而不是在 Dockerfile 中的变量,因此需要把 ARG 中的值在构建的时候赋值给 ENV

另一个使用 ARG 的例子

FROM nginx:1.13.1-alpineLABEL maintainer="GPF <5173180@qq.com>"#https://yeasy.gitbooks.io/docker_practice/content/image/build.htmlRUN mkdir -p /etc/nginx/cert \ && mkdir -p /etc/nginx/conf.d \ && mkdir -p /etc/nginx/sitesCOPY ./nginx.conf /etc/ngixn/nginx.confCOPY ./conf.d/ /etc/nginx/conf.d/COPY ./cert/ /etc/nginx/cert/COPY ./sites /etc/nginx/sites/ARG PHP_UPSTREAM_CONTAINER=php-fpmARG PHP_UPSTREAM_PORT=9000RUN echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER}:${PHP_UPSTREAM_PORT}; }" > /etc/nginx/conf.d/upstream.confVOLUME ["/var/log/nginx", "/var/www"]WORKDIR /usr/share/nginx/html

这里就只是用了ARG

ARG PHP_UPSTREAM_CONTAINER=php-fpmARG PHP_UPSTREAM_PORT=9000RUN echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER}:${PHP_UPSTREAM_PORT}; }" > /etc/nginx/conf.d/upstream.conf

这里的变量用的就是 ARG 而不是 ENV了,因为这条命令运行在 Dockerfile 当中的, 像这种临时使用一下的变量没必要存环境变量的值就很适合使用 ARG

推荐学习:《docker视频教程》

php入门到就业线上直播课:查看学习

上一篇:centos mysqld启动失败怎么办
下一篇:docker中解耦和半解耦的区别是什么
相关文章

 发表评论

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