一, 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
相关资料:
- https://vsupalov.com/docker-arg-vs-env/
- https://vsupalov.com/docker-build-time-env-values/
来源: http://www.bubuko.com/infodetail-3285327.html