Docker可以在Volumes定义中使用env变量吗?

时间:2017-10-23 18:35:03

标签: docker docker-compose yaml docker-swarm

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

    volumes: ['log-volume:/path/to/container/logs', 
              'data-volume:/path/to/container/data' ${WEBAPP_VOLUMES:-''}]

我认为应该将环境变量默认为空字符串,并且一切都应该是好的(即.env文件中未定义WEBAPP_VOLUMES)。然后使用,需要用逗号开始任何定义,不理想,但似乎可以接受。但是,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.

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

1 个答案:

答案 0 :(得分:2)

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

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

volumes:
    - log-volume:/path/to/container/logs
    - data-volume:/path/to/container/data
    - ${WEBAPP_VOLUME}:/path/to/container/app

...但是不会做你想要的(上面会让你用环境变量指定/path/to/container/app mount的来源,但是不允许你让那个mount可选,也不会让你神奇地将它扩展为多个不同的坐骑。)

您可能会发现可以使用extends关键字(在Extending services中描述)来获取您想要的行为,尽管在撰写文件格式的版本3及更高版本中已删除对该关键字的支持