如何在docker-compose配置YAML文件中定义变量?
问题
是否可以在docker-compose的配置YAML文件中定义变量?
我的使用场景参考
我计划使用"extends"功能,通过传递变量,基于一个基础YAML文件,使用多个子YAML文件进行配置。
有一个限制是操作命令不能太复杂(目标用户并非开发者),因此我希望命令是单行且不宜过长。所以在操作命令中定义变量(例如docker-compose -f ... up是可行的,但在开头添加VAR=foo对我来说太长太复杂,尤其是可能需要定义多个变量的情况下)。
我尝试过但无效的方法
目前我考虑过使用docker-compose的环境变量功能(注:我不在意要设置的变量是环境变量还是其他类型,只是因为已有相关功能所以尝试)。
无效:使用"environment"
version: '3.3' services: service_a: image: ubuntu:focal environment: ENV_A: "env_a" command: > /bin/bash -c "echo In docker container: $ENV_A"
预期会打印ENV_A的内容env_a,但实际未打印:
$ docker-compose -f a.yaml up WARNING: The ENV_A variable is not set. Defaulting to a blank string. : service_a_1 | In docker container: tmp_service_a_1 exited with code 0
无效:使用"env_file"
$ cat a.env ENV_A=env_a
$ cat b.yaml version: '3.3' services: service_b: image: ubuntu:focal env_file: ./a.env command: > /bin/bash -c "echo In docker container: $ENV_A"
结果:无效。
$ docker-compose -f b.yaml up WARNING: The ENV_A variable is not set. Defaulting to a blank string. : service_b_1 | In docker container:
操作环境
$ docker-compose --version docker-compose version 1.29.2, build 5becea4c $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.6 LTS :
解决方案
先解决你之前的命令失效问题
你遇到的核心问题是:YAML中的$ENV_A被docker-compose先解析为Compose层面的变量(而非容器内环境变量),但你的环境中没有定义该变量,所以被替换为空字符串。要让容器内的bash解析这个变量,需要让Compose跳过对$的解析,有两种方式:
- 用单引号包裹bash命令:
version: '3.3' services: service_a: image: ubuntu:focal environment: ENV_A: "env_a" command: > /bin/bash -c 'echo In docker container: $ENV_A'
- 转义
$为\$:
version: '3.3' services: service_a: image: ubuntu:focal environment: ENV_A: "env_a" command: > /bin/bash -c "echo In docker container: \$ENV_A"
满足你的核心需求:在Compose文件中定义变量+extends+简洁命令
下面两种方法都不需要在命令行手动传递变量,符合非技术用户的操作要求:
方法1:使用Compose扩展字段(多文件复用首选)
通过x-开头的自定义字段在基础文件中定义变量,子文件通过extends继承后可按需覆盖:
基础文件 base.yaml
version: '3.3' # 自定义变量集合 x-app-config: default_env: "production" ubuntu_tag: "focal" env_a_value: "default_env_a" services: base_service: image: ubuntu:${x-app-config:ubuntu_tag} environment: APP_ENV: ${x-app-config:default_env} ENV_A: ${x-app-config:env_a_value} command: > /bin/bash -c 'echo APP_ENV: $APP_ENV, ENV_A: $ENV_A'
子文件 dev.yaml
version: '3.3' services: service_a: extends: file: base.yaml service: base_service # 覆盖基础配置的变量值 environment: APP_ENV: "development" ENV_A: "dev_env_a"
运行命令(仅需指定文件):
docker-compose -f base.yaml -f dev.yaml up
方法2:使用项目根目录的.env文件
在项目根目录创建.env文件集中管理变量,Compose会自动加载,无需命令行传参:
.env文件
ENV_A=env_a_from_env UBUNTU_TAG=focal
Compose文件 c.yaml
version: '3.3' services: service_c: image: ubuntu:${UBUNTU_TAG} environment: ENV_A: ${ENV_A} command: > /bin/bash -c 'echo In docker container: $ENV_A'
运行命令:
docker-compose -f c.yaml up
内容的提问来源于stack exchange,提问作者IsaacS
相关产品推荐
相关产品推荐

