Docker为容器设置环境变量(在docker run命令中设置容器的环境变量、在Dockerfile文件中设置容器的环境变量、在docker-compose.yaml中设置容器的环境变量)
文章目录
- 1. Docker为容器设置环境变量的应用场景
- 1.1 配置应用程序
- 1.2 保护敏感信息
- 1.3 动态调整行为
- 1.4 简化部署过程
- 1.5 跨平台一致性
- 2. 准备工作
- 3. 在docker run命令中设置容器的环境变量
- 3.1 使用--env或-e标志
- 3.2 使用`--env-file`标志和环境变量文件
- 3. 在Dockerfile文件中设置容器的环境变量
- 4.1 创建 Dockerfile 文件
- 4.2 在 Dockerfile 文件中填写环境变量
- 4.3 使用 Dockerfile 构建镜像
- 4.4 启动容器
- 4.5 查看容器内的环境变量
- 5. 在docker-compose.yaml中设置容器的环境变量
- 5.1 使用environment标志
- 5.1.1 列表形式
- 5.1.2 字面量字典形式
- 5.1.3 示例
- 5.2 使用env_file标志和环境变量文件
- 6. 注意事项
更多 Docker 的使用技巧可以查看 Docker 专栏:Docker
1. Docker为容器设置环境变量的应用场景
Docker 为容器设置环境变量是一种常见的做法,在多种应用场景中发挥着重要作用,以下是一些典型的应用场景:
1.1 配置应用程序
环境变量可以用来传递配置信息给应用程序,比如数据库连接字符串、API密钥、服务端口等。这使得同一镜像可以在不同的环境中(开发、测试、生产)使用不同的配置,而无需改变代码或镜像本身
1.2 保护敏感信息
敏感数据如密码和认证令牌可以通过环境变量传入容器,而不是硬编码到应用代码或包含在镜像中。这对于提升安全性非常重要,因为镜像可能会被共享或公开
1.3 动态调整行为
通过设置环境变量,可以控制应用程序的行为模式。例如,开启或关闭某些功能特性,或者选择不同的日志级别
1.4 简化部署过程
在持续集成/持续部署(CI/CD)流程中,环境变量可以帮助自动化部署过程。不同阶段的部署(如开发、预发布、生产)可以使用相同的镜像,仅通过更改环境变量来适应不同的环境需求
1.5 跨平台一致性
使用环境变量有助于确保容器化应用在任何主机上运行时都能获得一致的配置,无论是在云服务器、本地机器还是开发者笔记本电脑上
2. 准备工作
- Alpine Linux 是一款轻量级、以安全为导向的 Linux 发行版,基于 musl libc 和 BusyBox
- Alpine Linux 于 2010 年前后创立,并迅速因其小巧、高效和安全性而受到欢迎
- Alpine Linux 特别适合用于路由器、防火墙、VPN、VoIP 盒子以及服务器操作系统,并且经常作为 Docker 容器镜像的基础操作系统
我们下载 alpine 镜像,用于验证为容器设置环境变量之后是否生效
sudo docker pull alpine:3.21.3
- 环境变量是操作系统级别的配置,在系统启动时设置,可以被系统中的所有进程访问
- 环境变量命名通常是全部使用大写字母,使用下划线
_
来分隔单词- 本文出现的小写字母加下划线分隔单词的环境变量命名方法是不规范的,之所以没有修改,是因为太费时间
3. 在docker run命令中设置容器的环境变量
3.1 使用–env或-e标志
在使用 docker run
命令启动容器时,可以使用 --env
或 -e
标志来设置环境变量
sudo docker run -d
--name alpine_01
--env "env01=value01"
alpine:3.21.3
查看容器内的环境变量
sudo docker inspect alpine_01 | jq '.[].Config.Env'
如果没有安装 jq 工具,可以使用以下指令查看容器的环境变量
sudo docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' alpine_01
可以发现,我们设置的环境变量生效了
如果要设置多个环境变量,可以在 docker run
命令中使用多个 --env
标志
sudo docker run -d
--name alpine_02
--env "env01=value01"
--env "env02=value02"
--env "env03=value03"
alpine:3.21.3
sudo docker inspect alpine_02 | jq '.[].Config.Env'
3.2 使用--env-file
标志和环境变量文件
可以创建一个环境变量文件,然后使用 docker run
命令启动容器时使用 --env-file
标志来指定环境变量文件
touch envFile
echo "env01=value01" >> envFile
echo "env02=value02" >> envFile
echo "env03=value03" >> envFile
sudo docker run -d
--name alpine_03
--env-file envFile
alpine:3.21.3
sudo docker inspect alpine_03 | jq '.[].Config.Env'
如果没有安装 jq 工具,可以使用以下指令查看容器的环境变量
sudo docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' alpine_02
3. 在Dockerfile文件中设置容器的环境变量
对 Dockerfile 不是很了解的同学,可以阅读我的另一篇博文:Dockerfile详解(Dockerfile的基本结构、使用Dockerfile自定义镜像示例、主流编程语言和中间件的基础Docker镜像、编写Dockerfile的最佳实践)
如果在构建镜像时就想设置环境变量,可以在 Dockerfile 中使用 ENV
指令
4.1 创建 Dockerfile 文件
touch Dockerfile
4.2 在 Dockerfile 文件中填写环境变量
FROM alpine:3.21.3
ENV env01 value01
ENV env02 value02
ENV env03 value03
4.3 使用 Dockerfile 构建镜像
sudo docker build -t my-alpine:1.0.0 ./
4.4 启动容器
sudo docker run -d
--name my_alpine
my-alpine:1.0.0
4.5 查看容器内的环境变量
sudo docker inspect my_alpine | jq '.[].Config.Env'
如果没有安装 jq 工具,可以使用以下指令查看容器的环境变量
sudo docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' my_alpine
5. 在docker-compose.yaml中设置容器的环境变量
对 docker-compose 不是很了解的同学,可以阅读我的另一篇博文:DockerCompose详解(DockerCompose简介、docker-compose.yml文件的基本结构、常用的DockerCompose命令、docker-compose.yml文件示例)
如果你使用 docker-compose
来管理容器,可以在 docker-compose.yaml
文件中设置环境变量
5.1 使用environment标志
5.1.1 列表形式
services:
web: # 定义一个服务名称为 web
image: nginx:1.27.3 # 指定服务使用的镜像
environment: # 定义环境变量
- NGINX_HOST=example.com # 设置单个环境变量
- NGINX_PORT=8080 # 设置另一个环境变量
- DEBUG=true # 设置布尔值环境变量
5.1.2 字面量字典形式
services:
web:
image: nginx:1.27.3
environment:
NGINX_HOST: example.com
NGINX_PORT: "8080"
DEBUG: "true"
5.1.3 示例
进入 vim 编辑器的 paste 模式,接着切换成插入模式,防止直接粘贴导致的格式混乱
vim docker-compose-01.yaml
set paste
将以下内容粘贴到 docker-compose-01.yaml 文件中
services:
my_alpine_01:
image: alpine:3.21.3
container_name: my_alpine_01
environment:
env_by_environment01: value01
env_by_environment02: value02
env_by_environment03: value03
my_alpine_02:
image: alpine:3.21.3
container_name: my_alpine_02
environment:
env_by_environment01: value01
env_by_environment02: value02
env_by_environment03: value03
启动容器
sudo docker-compose -f docker-compose-01.yaml up -d
查看环境变量
sudo docker inspect my_alpine_01 | jq '.[].Config.Env'
如果没有安装 jq 工具,可以使用以下指令查看容器的环境变量
sudo docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' my_alpine_01
删除由 docker-compose-01.yaml 文件编排的所有容器
sudo docker-compose -f docker-compose-01.yaml down
5.2 使用env_file标志和环境变量文件
可以同时使用
environment
和env_file
来设置环境变量,其中environment
中的变量会覆盖env_file
中的同名变量
先创建两个配置文件
touch envFile01 envFile02
填充配置文件
echo "env_by_env_file_01=value01" >> envFile01
echo "env_by_env_file_02=value02" >> envFile01
echo "env_by_env_file_03=value03" >> envFile01
echo "env_by_env_file_01=value01" >> envFile02
echo "env_by_env_file_02=value02" >> envFile02
echo "env_by_env_file_03=value03" >> envFile02
进入 vim 编辑器的 paste 模式,接着切换成插入模式,防止直接粘贴导致的格式混乱
vim docker-compose-02.yaml
set paste
将以下内容填入 docker-compose-02.yaml 文件中
services:
my_alpine_03:
image: alpine:3.21.3
container_name: my_alpine_03
env_file: envFile01
my_alpine_04:
image: alpine:3.21.3
container_name: my_alpine_04
env_file: envFile02
启动容器
sudo docker-compose -f docker-compose-02.yaml up -d
查看环境变量
sudo docker inspect my_alpine_03 | jq '.[].Config.Env'
如果没有安装 jq 工具,可以使用以下指令查看容器的环境变量
sudo docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' my_alpine_03
删除由 docker-compose-02.yaml 文件编排的所有容器
sudo docker-compose -f docker-compose-02.yaml down
6. 注意事项
- 环境变量的值如果包含空格或特殊字符,需要用引号括起来
- 在
docker run
命令通过-e
或--env
指令设置的环境变量会覆盖 Dockerfile 中ENV
指令设置的环境变量