You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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跳过对$的解析,有两种方式:

  1. 用单引号包裹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'
  1. 转义$为\$:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:15:54