【问题标题】:Docker-compose variable-substitution mandatory variablesdocker-compose 变量替换强制变量
【发布时间】:2020-04-11 19:33:00
【问题描述】:

我有一个 docker-compose 文件,它使用变量替换一些秘密,如果它们没有提供或为空,我想得到一个错误,为此我尝试了这个:

environment:
  - >-
    JAVA_OPTS=
    -DMYSQL_USER=${MYSQL_USER:?MYSQL_USER_NOT_SET}
    -DMYSQL_PASSWORD=${MYSQL_PASSWORD:?MYSQL_PASSWORD_NOT_SET}
    -DMYSQL_URL=db:3306/${MYSQL_DATABASE:?MYSQL_DATABASE_NOT_SET}

但是,它给了我错误:

错误:服务“myservice”中“环境”选项的插值格式无效:“JAVA_OPTS= -DMYSQL_USER=${MYSQL_USER:?MYSQL_USER_NOT_SET}...

根据https://docs.docker.com/compose/compose-file/#variable-substitution,这应该可以工作,因为它有这个sn-p:

同样,以下语法允许您指定强制 变量:

${VARIABLE:?err} 退出并显示包含 err if 的错误消息 VARIABLE 在环境中未设置或为空。 ${VARIABLE?err} 退出 如果 VARIABLE 在 环境。

我的 docker-compose 中也有 version: "3.4",所以这不应该是问题。

已经用${MY_VAR?MY_ERROR} 尝试过,但也没有用。 我什至查看了源代码,但没有发现任何帮助。

编辑:

我尝试了最小尺寸的复制:

docker-compose.yml

version: "3.4"

services:
  hello:
    image: hello-world
    environment:
      - TEST=${TEST?err}

docker-compose up

错误:服务“hello”中“环境”选项的插值格式无效:“TEST=${TEST?err}

【问题讨论】:

  • 使用${MY_VAR?MY_ERROR} 对我有用,并给我错误ERROR: Missing mandatory value for "environment" option in service "app": MY_ERROR。此外,您的 environment 密钥适用于预期的错误消息(不是您得到的插值消息)。
  • 还有一点需要注意。您必须使用“docker-compose”而不是“docker compose”。我猜“compose”子命令还没有达到这个功能的同等水平

标签: docker docker-compose environment-variables yaml variable-substitution


【解决方案1】:

这取决于您的 docker-compose 版本。

使用 docker-compose 1.17.1 你会得到
ERROR: Invalid interpolation format for "environment" option in service "my-service": ...
如果您使用 ${TEST?"My error message"} 但与
例如docker-compose 1.29.2 它按预期工作
ERROR: Missing mandatory value for "environment" option interpolating ... in service "my-service": "My error message"

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    相关资源
    最近更新 更多