docker-compose的一些占位符运用

这是一个普通的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。

同时获取 环境变量 可以使用 ${} 也可以直接使用 $

 

上一篇:神经网络中的人脑海马体:Memory Networks


下一篇:Pytracking installation on Linux