docker-compose 覆盖应用程序属性



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

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

这完美地解决了我的任务,所有 KEY=VALUE 对都会覆盖 application.yml 属性中现有的属性。但是,我有两个问题:

  1. 看来在我的 docker-compose 文件中有多个服务,我需要为每个服务指定一个单独的env_file,这可能不是很方便。是否有可能为整个 docker 撰写文件提供一个通用env_file?

  2. 我知道对于 docker-compose run 命令,有一个选项 -e,我可以在其中放置 env 变量的键=值对。码头工人撰写有类似的选择吗?我的意思是根本不使用env_file。

广告 1:这是不可能的。我也认为这是有意为之的 - 让开发人员定义哪个容器可以访问哪些.env数据。

广告 2:不可以,您不能使用docker-compose命令的运行时参数up提供变量(运行docker-compose help up以查看可用的运行时参数)。但是,您可以使用组合文件中environment子句来定义这些内容,例如:

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

即。

  1. 要么只是env var 的名称 - 然后从主机中获取其值
  2. 或整个定义以创建一个在容器中可用的新定义

有关更多说明,请参阅有关environment条款的文档。

为了覆盖某些设置,您可以做的另一件事是使用"父"文件extend撰写文件。关于extends条款的文档

不幸的是,截至目前,使用版本 3 的 compose 文件时extends不起作用,但正在此 github 问题中讨论它,所以希望它很快就会可用:)

最新更新