docker-compose覆盖应用程序属性

问题描述:

有一个Spring Boot应用程序,我们使用application.yml文件来存储属性。我得到了一个任务,让用户可以在启动应用程序时覆盖某些属性。考虑到我们已经对我们的应用程序docker-compose文件进行了docker化,我认为这是非常正确的地方。我发现了一个选项,它的实际工作,env_file:docker-compose覆盖应用程序属性

backend: 
    build: 
     context: backend 
     dockerfile: Dockerfile.backend 
    restart: always 
    ports: 
     - 3000:3000 
    env_file: 
     - backend/custom.env 
    volumes: 
     - ../m2_repo:/root/.m2/ 
     - ../{APP_NAME}/data_sources:/backend/data_sources/ 
    links: 
     - database 
    networks: 
     main: 
     aliases: 
      - backend 

这完美地解决了我的任务,所有的键值对覆盖现有的application.yml性能。但是,我有2个问题:

  1. 看来,在我的搬运工,撰写文件中有多个服务,我需要指定不同的服务,这可能不是很方便单独env_file。是否有可能为整个docker-compose文件创建一个共同的env_file?

  2. 我知道,对于docker-compose运行命令,有一个选项-e,我可以把env变量的key = value对。码头工人有没有类似的选择?我的意思是为了不使用env_file。

+0

为什么1)中的问题?你所有的服务都需要相同的属性吗?如果使用一个常见的env_file,是否没有重叠? –

+0

这不是问题,而是我正在寻找一个选项。我的属性不重叠,这实际上是我考虑有一个env_file而不是多个文件(每个服务一个) – Viacheslav

广告1:这是不可能的。我也相信这是故意的 - 让开发人员定义什么容器可以访问什么数据。广告2:不能,您无法使用运行参数up命令docker-compose(运行docker-compose help up以查看可用运行时参数)提供变量。但是你可以从撰写文件中定义这些使用environment条款,如:

restart: always 
ports: 
    - 3000:3000 
env_file: 
    - backend/custom.env 
environment: 
    - DB_PASSWORD   # <= #1 
    - APP_ENV=production # <= #2 

即。

  1. 要么只是一个名称的环境变量的 - 它的值,然后从主机
  2. 或全部定义带到创建一个新的容器
内面世

请参阅docs上的environment条款以获得更多的说明。

为了覆盖某些设置,您可以做的另一件事是使用“父”文件组合文件extendDocs on extends clause

遗憾的是,截至目前,使用第3版撰写文件时extends将无法​​正常工作,但它在这个github issue正在讨论,所以希望它也将很快面市:)