一、AVG与ENV
1、在Dockerfile中,使用ARG与ENV的区别
ARG:ARG定义的变量用于构建Docker镜像,在通过build把Dockerfile构建成镜像后,ARG定义的变量便不在起作用;
ENV:ENV定义的变量用于容器的环境变量,在Dockerfile里定义后,在容器的运行时是可以使用这个变量的
上面可能读起来比较绕,看下这个实例就明白了:
1)Dockerfile里有如下两行
ARG VAR_A=1 ENV VAR_B ${VAR_A}
2)通过构建镜像并启动容器后,查看环境变量如下
$ docker exec ContainerID env VAR_B=1
3)从实例可看出,ARG定义的变量在Dockerfile中使用,构建完镜像后,就下岗;而ENV定义的变量会带入容器的环境变量。
可以用一张图来表示ARG与ENV的作用域:
2、通常可以把ARG与ENV结合使用
ARG buildtime_variable=default_value
ENV env_var_name=$buildtime_variable
使用这种方式可以解决Dockerfile硬编码的问题,比如在微服务下很多服务的情况下,构建一个镜像修改一次Dockerfile,而使用这种方式Dockerfile是不变的,只需要在docker build的时候加上参数值就可以。
二、传递环境变量的方法
1)Dockerfile文件里通过ENV指定
2)docker [option] -e VAR_NAME=VALUE指定,如果build的Dockerfile文件里有,将会覆盖
3)docker service update --env-add VAR_NAME=VALUE 添加
三、查看环境变量的方法
1、通过docker exec命令查看
$ docker exec ContainerID env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=lile LANG=en_US.UTF-8 JAVA_VERSION=8 ......
2、通过docker inspect方式查看
docker inspect --format='{{.Config.Env}}' ContainerID
3、进入容器通过/proc/PID/environ的方式
$ cat /proc/1/environ
四、其他
通过docker inspect可用通过--format指定获取值,可用不用对返回的JSON通过代码做分析;如:获取机器的IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ContainerID
相关资料: