云计算百科
云计算领域专业知识百科平台

docker-compose文件属性(9)插值

 Compose 文件中的值可以通过变量设置,并在运行时进行插值替换。Compose 文件使用类 Bash 语法 ${VARIABLE}。同时支持 $VARIABLE 和 ${VARIABLE} 两种语法。

对于带大括号的表达式,支持以下格式:

  • 直接替换:${VAR} → VAR 的值
  • 默认值:
    • ${VAR:-default} → 如果 VAR 已设置且非空,则为 VAR 的值;否则为 default
    • ${VAR-default} → 如果 VAR 已设置,则为 VAR 的值;否则为 default
  • 必需值:
    • ${VAR:?error} → 如果 VAR 已设置且非空,则为 VAR 的值;否则退出并报错
    • ${VAR?error} → 如果 VAR 已设置,则为 VAR 的值;否则退出并报错
  • 替代值:
    • ${VAR:+replacement} → 如果 VAR 已设置且非空,则为 replacement;否则为空
    • ${VAR+replacement} → 如果 VAR 已设置,则为 replacement;否则为空

插值也可以嵌套使用:

${VARIABLE:-${FOO}}

${VARIABLE?$FOO}

${VARIABLE:-${FOO:-default}}

Compose 不支持其他扩展的 Shell 风格特性,例如 ${VARIABLE/foo/bar}。

只要构成有效的变量定义(字母数字名称 [_a-zA-Z][_a-zA-Z0-9]* 或以 ${ 开头的带括号字符串),Compose 就会处理 $ 符号后的任何字符串。在其他情况下,它将保留原样而不尝试插值替换。

当配置中需要字面美元符号时,可以使用 $$(双美元符号)。这也可以防止 Compose 进行插值替换,因此 $$ 允许您引用不希望被 Compose 处理的环境变量。

web:
build: .
command: "$$VAR_NOT_INTERPOLATED_BY_COMPOSE"

如果 Compose 无法解析一个待替换的变量且未定义默认值,它会显示警告并将该变量替换为空字符串。

由于 Compose 文件中的任何值都可以通过变量替换进行插值(包括复杂元素的紧凑字符串表示法),插值操作会在每个文件的基础上,在合并之前应用。

插值仅适用于 YAML 的值(values),而不适用于键(keys)。在少数键实际上是任意用户定义字符串的场景中(例如标签或环境变量),必须使用等号替代语法才能使插值生效。例如:

services:
foo:
labels:
"$VAR_NOT_INTERPOLATED_BY_COMPOSE": "BAR"

services:
foo:
labels:
– "$VAR_INTERPOLATED_BY_COMPOSE=BAR"

version: '3.8'

services:
web:
image: nginx

# ❌ 错误:试图在键中使用变量(无效)
# ${PREFIX}_LABEL: value # 这不会工作

# ✅ 正确:标签使用等号语法使键可插值
labels:
– "${PREFIX}.version=1.0" # 键和值都可插值
– "com.${COMPANY:-example}.app=${APP_NAME}" # 嵌套插值
– "${ENV}_deployed=${TIMESTAMP}" # 动态键名

# ✅ 环境变量同样适用
environment:
– "${PREFIX}_DB_HOST=${DB_HOST}" # 动态环境变量名
– "APP_${ENV_MODE}_CONFIG=${CONFIG_PATH}"
– "JAVA_OPTS=${JAVA_OPTS:–Xmx512m}"

# ❌ 这些不会进行键插值
# ports:
# – "${PORT_MAPPING}" # 如果期望 "8080:80" 这样的字符串,这是可以的
# 但如果是 "${HOST_PORT}:${CONTAINER_PORT}",两个变量都会在值中插值

锚点->插值->配置合并和环境变量设置

赞(0)
未经允许不得转载:网硕互联帮助中心 » docker-compose文件属性(9)插值
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!