在 Docker Compose 中,可以通过以下方式使用环境变量文件来配置服务的环境变量:
创建一个 .env 文件,用于存储环境变量。例如:
MY_VARIABLE=value
ANOTHER_VARIABLE=another_value也可以创建多个环境变量文件,例如 .env.development、.env.production 等,用于不同的环境。
在 docker-compose.yml 文件中,可以使用 env_file 关键字来引用环境变量文件。例如:
version: '3'
services:
# 定义mysql服务
mysql:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: 12345678
MYSQL_DATABASE: demo_db
volumes:
- /var/data/mysql:/var/lib/mysql
networks:
- mynetwork
# 定义nginx服务
nginx:
image: nginx:latest
ports:
- "8080:80"
depends_on:
- mysql
# 加载环境变量文件
env_file:
- .env
volumes:
- /var/data/nginx_config:/etc/nginx/conf.d
- myvolume:/usr/share/nginx/html
networks:
- mynetwork
networks:
mynetwork:
driver: bridge
volumes:
myvolume:上面例子中,nginx 服务将从 .env 文件中读取环境变量。
启动服务:
root@hxstrive:~# cat .env
MY_VARIABLE=value
ANOTHER_VARIABLE=another_value
root@hxstrive:~# docker-compose up -d
Creating network "root_mynetwork" with driver "bridge"
Creating root_mysql_1 ... done
Creating root_nginx_1 ... done
root@hxstrive:~# docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------
root_mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
root_nginx_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8080->80/tcp,:::8080->80/tcp当然,我们也可以指定多个环境变量文件,它们将按照顺序读取,后面的文件中的变量会覆盖前面文件中的同名变量。例如:
version: '3'
services:
# 定义服务
myservice:
image: myimage
env_file:
- .env.common
- .env.development上面示例将先读取 .env.common 文件,然后读取 .env.development 文件,后者中的变量会覆盖前者中的同名变量。
(1)环境变量文件中的变量名和值之间用等号(=)连接,没有空格。
(2)环境变量文件中的注释可以使用 # 开头。
(3)确保环境变量文件的路径是相对于 docker-compose.yml 文件的位置。
(4)如果环境变量文件中的变量名与服务定义中的其他配置冲突,可能会导致意外的结果。在这种情况下,需要仔细检查变量的使用和优先级。