Docker 可以在卷定义中使用环境变量吗?

Joe*_*oeG 4 yaml docker docker-compose docker-swarm

webapp在 docker compose 文件中定义了一项服务。尝试为用户添加一些灵活性来自定义卷安装。我尝试了很多变体,但都没有成功,最有希望的一个是:

    volumes: ['log-volume:/path/to/container/logs', 
              'data-volume:/path/to/container/data' ${WEBAPP_VOLUMES:-''}]
Run Code Online (Sandbox Code Playgroud)

我认为这应该将环境变量默认为空字符串,并且一切都应该很好(即 ​​WEBAPP_VOLUMES 未在 .env 文件中定义)。然后要使用,需要以逗号开始任何定义,这并不理想,但似乎可以接受。然而,docker-compose讨厌这个!

我收到如下错误:

ERROR: yaml.scanner.ScannerError: while scanning a plain scalar
  in "./docker-compose.yml", line 20, column 110
found unexpected ':'
  in "./docker-compose.yml", line 20, column 124
Please check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.
Run Code Online (Sandbox Code Playgroud)

有谁知道要完成我在这里想做的事情?

lar*_*sks 9

当然,Docker 可以在卷定义中使用环境变量,但不是您尝试的方式。变量替换发生在 YAML 解析之后。您尝试使用的语法会导致 YAML 语法错误(因此出现yaml.scanner.ScannerError异常),因此 docker-compose 甚至无法读取配置。您可以使用像yaml 解析器这样的工具来验证 YAML 语法。

像这样的东西是有效的语法:

volumes:
    - log-volume:/path/to/container/logs
    - data-volume:/path/to/container/data
    - ${WEBAPP_VOLUME}:/path/to/container/app
Run Code Online (Sandbox Code Playgroud)

...但不会做你想做的事(上面的内容可以让你/path/to/container/app用环境变量指定安装的来源,但不会让你将该安装设为可选,也不会让你神奇地将其扩展为多个不同的安装) 。

您可能会发现可以使用extends关键字(在扩展服务中进行了描述)来获得您想要的行为,尽管在 compose 文件格式的版本 3 及更高版本中已删除对该关键字的支持。