这是一个普通的docker-compose文件
version: '3' services: applymgr: image: harbor.cloud.test/online/applymgr:b88b2301 networks: - default dns: - 10.99.165.22 extra_hosts: - "zk_hadoop_hbase_kafka:10.109.95.32" environment: CONFIG_SERVER_URI: http://10.09.65.43:8002 DEUREKA_URL: http://user:123@10.19.25.53:8001 JAVA_OPTS: -Xms1024m -Xmx1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 command: java -jar -Dspring.profiles.active=test3 manager.jar ports: - "18001:8080" networks: default: driver: bridge
这里 environment 表示环境变量。我们这里设置了一些环境变量。数量不多,但是显得很繁琐。
command 表示我们使用什么命令启动镜像中的jar 文件,它会覆盖Dockerfile中的CMD指令。
这里我们看到配置都是写死的,怎么才能配置化呢?
docker-compose 其实支持文件环境变量
version: '3' services: applymgr: image: harbor.cloud.test/online/applymgr:b88b2301 networks: - default dns: - 10.99.165.22 extra_hosts: - "zk_hadoop_hbase_kafka:10.109.95.32" env_file: - ./common.env command: java -jar ${RUN_PROFILE} manager.jar ports: - "18001:8080" networks: default: driver: bridge
这里可以看到我们把具体的环境变量换成了引用 当前目录下的 common.env文件。同时command 指令也使用了占位符来获取环境变量的值。看下环境变量文件中的内容:
CONFIG_SERVER_URI=http://10.88.75.83:8002 EUREKA_URL=http://user:123@10.88.75.83:8001 JAVA_OPTS=-Xms512m -Xmx512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 RUN_PROFILE=-Dspring.profiles.active=test3
之后怎么验证呢,其实我们可以使用命令查看docker-compose.yml效果
docker-compose config
执行该命令,得到结果:
networks: default: driver: bridge services: applymgr: command: java -jar manager.jar dns: - 10.99.165.22 environment: CONFIG_SERVER_URI: http://10.88.75.83:8002 EUREKA_URL: http://user:123@10.88.75.83:8001 JAVA_OPTS: -Xms512m -Xmx512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 RUN_PROFILE: -Dspring.profiles.active=test3 extra_hosts: - zk_hadoop_hbase_kafka:10.109.95.32 image: harbor.cloud.test/online/applymgr:b88b2301 networks: default: null ports: - 18001:8080/tcp version: '3.0'
发现环境变量都设置进去了,但是我们再commond 那里设置的占位符 却变成了空格。那说名占位符并没有取到环境变量的值。
那么这是什么原因了。如果我们把 common.env 重命名为 .env 。同时更改docker-compose.yml文件 env_file 中的文件名。此时可以看到
version: '3' services: applymgr: image: harbor.cloud.test/online/applymgr:b88b2301 networks: - default dns: - 10.99.165.22 extra_hosts: - "zk_hadoop_hbase_kafka:10.109.95.32" env_file: - ./.env command: java -jar ${RUN_PROFILE} manager.jar ports: - "18001:8080" networks: default: driver: bridge
结果:
networks: default: driver: bridge services: applymgr: command: java -jar -Dspring.profiles.active=test3 manager.jar dns: - 10.99.165.22 environment: CONFIG_SERVER_URI: http://10.88.75.83:8002 EUREKA_URL: http://user:123@10.88.75.83:8001 JAVA_OPTS: -Xms512m -Xmx512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 RUN_PROFILE: -Dspring.profiles.active=test3 extra_hosts: - zk_hadoop_hbase_kafka:10.109.95.32 image: harbor.cloud.test/online/applymgr:b88b2301 networks: default: null ports: - 18001:8080/tcp version: '3.0'
可以看到command 获取环境变量成功了。因为如果我们使用文件设置环境变量。那么文件名 尽量设置为 .env。
同时获取 环境变量 可以使用 ${} 也可以直接使用 $