Docker Compose中的环境变量赋值 - 冒号方式

时间:2017-03-30 00:29:06

标签: variables syntax environment-variables yaml docker-compose

这是关于docker-compose.yml文件语法的问题。我在互联网上遇到了这样的变量赋值:

environment:
    PMA_HOST: mysql

http://tech.osteel.me/posts/2017/01/15/how-to-use-docker-for-local-web-development-an-update.html

另一方面,文档说明如下:

environment:
  - DEBUG=1

https://docs.docker.com/compose/environment-variables/

没有破折号和冒号的方式吗?有什么区别?

1 个答案:

答案 0 :(得分:13)

文档本身说both methods are working

  

您可以使用数组或字典。

现在让我们原谅Docker未能使用正确的术语(数组实际上是YAML中的序列,字典是映射)并且具有从YAML的角度来看:

映射是YAML语法的一部分,因此由YAML解析器解析,这使得语法感知编辑器能够进行适当的突出显示等。与文档说的一样,truefalse等值将由YAML转换为布尔值,因此您需要注意这一点。来自docs的示例:

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

如果我们不引用'true',它会被解析为布尔值,这不是我们想要的。

另一方面,使用序列会留下YAML语法的空间。序列本身是YAML,但值只是被解析为每个标量。例如,序列中的第一个标量值:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

将被YAML解析为RACK_ENV=development。 Docker将进行后处理以将变量名称与值分开。因此,使用此方法意味着您正在使用两个解析步骤,这使得语法感知编辑器更难以正确地突出显示它。此外,您还会向用户强制决定使用=:的位置,这对于那些不熟悉YAML的人来说并不是很明显。它会让人迷惑。

考虑逃避,true不再需要引用了。这是因为它位于YAML标量的中间,因此不会被解析为独立值。实际上,引用它会使YAML将引号视为内容。

这也意味着如果你需要引用(例如因为你想使用转义序列),你需要引用整个标量。例如,如果您希望在值中包含制表符,则它将如下所示:

environment:
  - "MY_VAR=some\tvalue"

如果您仅在=之后引用该部分,则无效。同样,这可能令人困惑。

结论:对我来说,似乎使用映射更加一致并且使用户更加困惑,因此它更为可取。因人而异。