大家好,欢迎来到IT知识分享网。
当书写Dockerfile文件或运行Docker容器时,经常遇到使用变量的情况,我们可能会首先想到环境变量,Dockerfile还有一个“ARG”指令,它们有什么使用场景和区别?这篇文章就回答这个问题。
要点
- “.env”文件,使用docker-compose.yaml文件,里面以“$”开头的变量将被“.env”文件定义的变量替换,两个文件要放在同一个目录下
- “ENV”定义的变量值在构建镜像和运行容器时都可以使用
- “ARG”定义的变量仅在构建镜像时可用
- “env_file”,在“docker-compose.yaml”中可以通过该key引入一个文件,里面包含多个环境变量
- “ARG”和“ENV”配置的变量如果传入到镜像中,通过“docker history”命令可见,所以不要将敏感数据通过二者传入镜像
ARG和ENV
“ARG”仅在构建镜像时可用,运行中的容器不能访问ARG变量的值,也就是说“CMD”和“ENTRYPOINT”不能访问ARG的值,运行下面Dockerfile文件构建的镜像是没有任何输出的,
FROM alpine:3.11 ARG name=aneirin ENTRYPOINT /bin/sh -c "echo $name;sleep 3"
“ENV”变量相比较“ARG”变量作用域就显得大些,它不仅在镜像构建时可用,在容器运行后,也可以使用,因此运行下面Dockerfile构建的镜像是有输出的,
FROM alpine:3.11 ENV name=aneirin //默认值为aneirin,通常使用"--build-arg"选项传入值 ENTRYPOINT /bin/sh -c "echo $name;sleep 3"
输出:
aneirin@host-1:~/test$ docker run test:0.1 aneirin
在运行容器时如果传入相同名称的环境变量,原来的值会被覆盖。
如何设置“ARG”的值
ARG变量值在Dockerfile文件或执行“docker build”时通过选项“–build-arg”赋值。
1,通过Dockerfile文件直接赋值
FROM alpine:3.11 ARG name=aneirin RUN echo "Hello ${name}" ENTRYPOINT /bin/sh -c "echo $name;sleep 3"
构建镜像时会有ARG的值会输出,
...... Step 3/4 : RUN echo "Hello ${name}" ---> Running in f9e7b92b8f00 Hello aneirin ......
2,通过“–build-arg”赋值
Dockerfile文件如下:
FROM alpine:3.11 ARG name RUN echo "Hello ${name}" ENTRYPOINT /bin/sh -c "echo $name;sleep 3" #运行容器是没有输出的
构建镜像命令:“docker build -t test:0.1 –build-arg name=aneirin .”,和上面的效果是相同的。
如何设置“ENV”的值
1,直接在Dockerfile中指定,和ARG是相同的,提供默认值的方式
2,通过ARG将值传给ENV,如下,
FROM alpine:3.11 ARG arg_name ENV name=$arg_name ENTRYPOINT /bin/sh -c "echo $name;sleep 3"
这种方式可以在构建镜像时方便修改环境变量的值,使用不多
3,运行容器时通过命令行传入变量值,
FROM alpine:3.11 ENV name=aneirin #必须提供默认值,否则构建会失败 ENTRYPOINT /bin/sh -c "echo $name;sleep 3"
运行容器时,可动态传入值:“docker run -e name=rachel test:0.1”,原来的值被覆盖。
4,从运行容器的主机环境传入变量,
export name=rachel //当前主机环境配置环境变量name docker run -e name test:0.1 env //容器从当前主机环境得到name的值
5,运行容器时通过选项“–env-file”选项传入值。和第三种方式类似,读者可以自己测试下。
env文件(.env)
“.env”和“docker-compose.yaml”要配合使用,两个文件需要放在相同的目录下,使用方式和上面“ENV”的第5种传值方式类似。
在“.env”文件中定义环境变量,“docker-compose.yaml”文件声明的环境变量会自动引用配置在文件“.env”中的值,
“.env”文件:
env_name="Alice"
“Dockerfile”:
FROM alpine:3.11 ENV name=aneirin ENTRYPOINT /bin/sh -c "echo $name;sleep 3"
“docker-compose.yaml”
version: '3' services: test: image: test:0.1 environment: - name="${env_name}"
执行“docker-compose up”,输出name值为“Alice”
总结
文章主要展示Dockerfile中“ARG”和“ENV”指令的区别和用法,特别“ENV”指令使用比较频繁,值得深入学习。对于敏感数据可以将其保存在文件“.env”中,使用“docker-compose up”方式运行容器。
希望这篇文章能帮到正在努力的你,欢迎关注并评论!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/178284.html