在 docker-compose.yml 中重用环境变量
Posted
技术标签:
【中文标题】在 docker-compose.yml 中重用环境变量【英文标题】:Re-using environment variables in docker-compose.yml 【发布时间】:2016-07-16 23:38:59 【问题描述】:是否可以重复使用在多个容器之间共享的环境变量?
这个想法是为了避免重复,如下例所示:
version: '2'
services:
db:
image: example/db
ports:
- "8443:8443"
container_name: db
hostname: db
environment:
- USER_NAME = admin
- USER_PASSWORD = admin
svc:
image: example/svc
depends_on:
- db
ports:
- "9443:9443"
container_name: svc
hostname: svc
environment:
- DB_URL = https://db:8443
- DB_USER_NAME = admin
- DB_USER_PASSWORD = admin
【问题讨论】:
【参考方案1】:extends
选项可能很好,但它是3.x
撰写文件中的not supported。其他方法是:
Extension fields(撰写文件 3.4+)
如果您可以使用 3.4+ 撰写文件,扩展字段可能是最佳选择:
docker-compose.yml
version: '3.4'
x-common-variables: &common-variables
VARIABLE: some_value
ANOTHER_VARIABLE: another_value
services:
some_service:
image: someimage
environment: *common-variables
another_service:
image: anotherimage
environment:
<<: *common-variables
NON_COMMON_VARIABLE: 'non_common_value'
env_file 指令
docker-compose.yml
version: '3.2'
services:
some_service:
image: someimage
env_file:
- 'variables.env'
another_service:
image: anotherimage
env_file:
- 'variables.env'
variables.env
VARIABLE=some_value
ANOTHER_VARIABLE=another_value
.env file 在项目根目录中 (或实际撰写环境中的变量)
.env 文件中的变量可以在服务配置中引用:
docker-compose.yml
version: '3.2'
services:
some_service:
image: someimage
environment:
- VARIABLE
another_service:
image: anotherimage
environment:
- VARIABLE
- ANOTHER_VARIABLE
.env
VARIABLE=some_value
ANOTHER_VARIABLE=another_value
【讨论】:
对于那些不太熟悉 YAML 的人:关于 notation==> 环境的原因,请参阅 YAML 中的“Merge key language”: @logicOnAbstractions 我的扩展字段文档链接就足够了,那里解释了 YAML 功能docker-compose.yml
中是否可以重复使用扩展字段进行替换?【参考方案2】:
您可以使用extends 指令(可在组合1.x
和2.x
中使用)让多个容器从底层服务描述继承environment
配置。例如,将以下内容放入名为 base.yml
的文件中:
version: '2'
services:
base:
environment:
DB_URL: https://db:8443
DB_USER_NAME: admin
DB_USER_PASSWORD: admin
然后在你的docker-compose.yml
:
version: '2'
services:
container1:
image: alpine
command: sh -c "env; sleep 900"
extends:
file: base.yml
service: base
container2:
image: alpine
command: sh -c "env; sleep 900"
extends:
file: base.yml
service: base
environment:
ANOTHERVAR: this is a test
那么在container1
里面,你会看到:
DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
在container2
内部你会看到:
DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
ANOTHERVAR=this is a test
您显然可以将extends
用于environment
指令以外的其他内容;这是使用 docker-compose 时避免重复的好方法。
【讨论】:
extends
非常适合我的用例。它比局部变量更可取,因为它消除了对特定用户的依赖。我可以用extends
做的另一件事是指定通用容器标签。
我可以extends
提供多个服务吗?还是来自每个服务的多个文件?
对于从子目录调用内容时遇到 FileNotFoundError 的其他任何人,您可以改用文件的相对路径:“./base.yml”【参考方案3】:
您可以从 docker-compose 文件中引用本地环境变量。假设您想要做的是使USER_NAME
与DB_USER_NAME
相同:
docker-compose.yml
version: '2'
services:
db:
image: example/db
ports:
- "8443:8443"
container_name: db
hostname: db
environment:
- USER_NAME = $USERNAME
- USER_PASSWORD = $PASSWORD
svc:
image: example/svc
depends_on:
- db
ports:
- "9443:9443"
container_name: svc
hostname: svc
environment:
- DB_URL = https://db:8443
- DB_USER_NAME = $USERNAME
- DB_USER_PASSWORD = $PASSWORD
然后,像这样运行 docker-compose:
$ USERNAME="admin" PASSWORD="admin" docker-compose up
或者,对于更永久、更容易重复输入的内容:
$ printf '%s\n%s\n' 'export USERNAME="admin"' 'export PASSWORD="admin"' >> ~/.bash_profile
$ source ~/.bash_profile
$ docker-compose up
【讨论】:
我觉得$ USERNAME="admin" PASSWORD="admin" docker-compose up
不好。像$ history
这样的黑客并使用历史cmd获取密码
@ChangwooRhee 如果您在本地使用 docker-compose 的敏感凭据,您会遇到与技术无关的问题
本地敏感凭据、非版本化文件等没有任何问题。但是像你一样传递它们会更糟,关于其他东西不好的论点并不能否定它是不好的建议。
@James 也许我应该更明确一点:一个人永远不应该在本地拥有敏感凭据。事实上,理想情况下,永远不应该有人知道生产数据库的密码。以上是关于在 docker-compose.yml 中重用环境变量的主要内容,如果未能解决你的问题,请参考以下文章
如何在 docker-compose.yml 中开始测试之前等待数据库迁移完成
在文件'./docker-compose.yml'中,服务'proxy-nginx'必须是映射而不是字符串?