使用docker compose时可以通过环境变量来动态设置compose文件中的值,运行时把这些变量插入配置中。这样方式非常灵活,适合需要根据不同环境比如开发/测试/生产等动态调整配置的场景。在docker compose文件中,可以通过${VARIABLE_NAME}格式引用环境变量,这些变量能在运行时从以下来源获得:环境变量文件可以在项目根目录下创建一个.env文件定义变量。命令行参数可以通过以下命令获取e参数指定环境变量:
docker-compose
系统环境变量可以直接在操作系统中设置环境变量。如果现在当前有个简单docker compose文件docker-compose.yml:
version: '3.8'
services:
web:
image: "nginx:latest"
ports:
- "${WEB_PORT}:80"
environment:
- NGINX_HOST=${NGINX_HOST}
如果需要在项目根目录中创建一个.ev文件定义变量:
WEB_PORT=8080
NGINX_HOST=example.com
运行 docker-compose up 时,Docker Compose 会自动加载 .env 文件中的变量,并将它们插入到 docker-compose.yml 文件中。因此,WEB_PORT 和 NGINX_HOST 的值会被替换为 8080 和 example.com。
还可以用命令参数动态调整设置环境变量:
WEB_PORT=9090 NGINX_HOST=another-example.com docker-compose up
这样方式可以覆盖.env文件中定义的变量值。
还可以直接在操作环境中设置环境变量。如Linux或macOS上面运行:
export WEB_PORT=8080
export NGINX_HOST=example.com
变量未定义时的默认值,当某个变量未定义docker compose会报错,为了避免这样情况可以在docker-compose.yml文件中为变量设置默认值如:
ports:
- "${WEB_PORT:-8080}:80"
${WEB_PORT:-8080} 表示如果 WEB_PORT 未定义,则使用默认值8080。
环境变量的值必须是字符串,如果需要传递复杂都值需要确保格式正确,避免在.env文件中存储重要信息,如密码登敏感信息。敏感信息可以使用docker的secrets功能或环境变量管理工具。使用环境变量通过docker compose文件更加灵活适应不同部署环境。