Docker-Compose环境变量
- 背景
- 配置文件
- 修改docker-compose.yml
- 在服务内部使用环境变量
- 重新构建容器
- 补充
背景
现状是通过Docker-Compose配置管理系统的各个容器服务、因为是微服务架构所以配置文件很多、但是例如数据库、redis、kafka等配置都是同一份但是需要在多个配置文件做映射
想到spring可以自动读取环境变量的特性、就准备做一个配置文件预置所有公共配置,将配置文件中的配置写入docker容器的环境变量
配置文件
在docker-compose.yml同级目录下新建文件夹 .env
将公共的配置参数使用key = value的方式写在配置文件中
.env
为隐藏文件夹查看时使用ll -a
DB_IP=127.0.0.1
MYSQL_USER=root
MYSQL_PASSWORD= password
HOST=127.0.0.1
REDIS_IP=127.0.0.1
REDIS_PASSWORD= password
修改docker-compose.yml
将配置文件定义的参数传递给容器作为环境变量
version: "2.1"
services:
test:
container_name: "test"
image: jdk8
restart: always
environment:
TZ: "Asia/Shanghai"
START_COMMAND: ""
JAVA_OPTS: "-Xms512m -Xmx2048m"
REDIS_IP: $REDIS_IP
REDIS_PASSWORD: $REDIS_PASSWORD
DB_IP: $DB_IP
MYSQL_USER: $MYSQL_USER
MYSQL_PASSWORD: $MYSQL_PASSWORD
DUBBO_REGISTRY_ADDRESS: $DUBBO_REGISTRY_ADDRESS
volumes:
- "/opt/conf:/opt/conf"
- "/opt/logs:/opt/logs"
network_mode: "host"
web:
container_name: "web"
image: nginx
restart: always
ports:
- 80:80
environment:
TZ: "Asia/Shanghai"
HOST: $HOST
volumes:
- "/opt/nginx/html:/opt/nginx/html"
- "/opt/nginx/nginx.conf:/etc/nginx/nginx.conf"
- "/opt/nginx/logs/nginx:/etc/nginx/logs"
- "/opt/nginx/templates:/etc/nginx/templates"
command: /bin/bash -c "envsubst '$${HOST}' < /etc/nginx/templates/default.conf.template > /etc/nginx/nginx.conf && nginx -g 'daemon off;'"
在服务内部使用环境变量
spring:
application:
name: test
datasource:
name: druidDataSource
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${DB_IP}/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true&useSSL=true&serverTimezone=Asia/Shanghai
username: ${MYSQL_USER}
password: ${MYSQL_PASSWORD}
重新构建容器
需要重新构建使配置的环境变量在服务内部生效生效
# test 为容器名称
docker-compose -f docker-compose.yml up --build -d test
命令会默认找到docker-compose.yml同目录下的.env
文件、需要指定文件可添加参数--env-file
形如
docker-compose -f ./docker-compose.yml --env-file /path/.env up --build -d
重新构建后可以通过docker inspect test(容器名)
看到容器信息环境变量已经生效、服务也是正常的
补充
nginx和sping服务不一样,在nginx.conf文件不能直接获取环境变量
需要使用 envsubst 将nginx配置的HOST替换
command: /bin/bash -c "envsubst '$${HOST}' < /etc/nginx/templates/default.conf.template > /etc/nginx/nginx.conf && nginx -g 'daemon off;'"
参考地址:https://www.baeldung-cn.com/linux/nginx-config-environment-variables#23-docker-compose
不通框架使用环境变量可能有限制、例如dubbo的2.6.x版本使用环境变量
使用别的变量名会有问题。