gst*_*low 7 variables code-duplication duplicates docker docker-compose
我有这样的文件:
service1:
//some stuff
environment:
- "PROP=some_common_value"
service2:
//some stuff
environment:
- "PROP=some_common_value"
service2:
//some stuff
environment:
- "PROP=some_common_value"
Run Code Online (Sandbox Code Playgroud)
我想设置具有相同值的属性.
我现在可以复制那个值.看起来很糟糕.
在docker中有没有办法创建交叉服务常量?
有几种选择.如果使用docker-compose
和不docker stack deploy
使用部署,则可以使用.env
文件来设置变量.或者使用docker-compose或swarm模式,您可以在shell中设置环境变量(通常是用于部署应用程序的shell脚本).在yaml内部,您将使用环境变量,如:
service1:
environment:
- PROP
service2:
environment:
- PROP
service2:
environment:
- PROP
Run Code Online (Sandbox Code Playgroud)
或明确使用变量,如:
service1:
environment:
- PROP=${PROP}
service2:
environment:
- PROP=${PROP}
service3:
environment:
- PROP=${PROP}
Run Code Online (Sandbox Code Playgroud)
如果您有一个.env
文件并且想要执行某个操作docker stack deploy
,则可以使用以下任一方法编写该文件的处理:
# option 1, leaves vars set in shell
set -a && . .env && set +a && docker stack deploy -c compose.yml stack_name
# option 2, only sets vars for single command
env $(cat .env | xargs) docker stack deploy -c compose.yml stack_name
Run Code Online (Sandbox Code Playgroud)
在上面的每一个中,.env
只是您可以在shell中设置的变量:
PROP=some_common_value
Run Code Online (Sandbox Code Playgroud)
下一个选项是使用锚点和别名的Yaml语法.这从Yaml文件的一个部分复制到另一个部分(为了支持在service3中合并,我切换到键/值而不是数组语法):
service1:
environment: &common_env
PROP: "some_common_value"
service2:
environment: *common_env
service3:
environment:
<<: *common_env
PROP3: "unique value"
Run Code Online (Sandbox Code Playgroud)
为了允许每个服务具有唯一值,Docker 在最新版本的compose语法中添加了扩展字段.这使您可以定义与任何服务定义分开的锚点,并将其合并到每个服务中,每个服务都有自己的唯一值,例如:
version: '3.4'
x-common-env: &common_env
PROP: "some_common_value"
services:
service1:
environment:
<<: *common_env
PROP1: "unique value 1"
service2:
environment:
<<: *common_env
PROP2: "unique value 2"
service3:
environment:
<<: *common_env
PROP3: "unique value 3"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
331 次 |
最近记录: |