这是关于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/
没有破折号和冒号的方式吗?有什么区别?
答案 0 :(得分:13)
文档本身说both methods are working:
您可以使用数组或字典。
现在让我们原谅Docker未能使用正确的术语(数组实际上是YAML中的序列,字典是映射)并且具有从YAML的角度来看:
映射是YAML语法的一部分,因此由YAML解析器解析,这使得语法感知编辑器能够进行适当的突出显示等。与文档说的一样,true
和false
等值将由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"
如果您仅在=
之后引用该部分,则无效。同样,这可能令人困惑。
结论:对我来说,似乎使用映射更加一致并且使用户更加困惑,因此它更为可取。因人而异。