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

trz*_*czy 7 variables syntax yaml environment-variables docker-compose

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

environment:
    PMA_HOST: mysql
Run Code Online (Sandbox Code Playgroud)

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


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

environment:
  - DEBUG=1
Run Code Online (Sandbox Code Playgroud)

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

是没有破折号和结肠的方式吗?有什么不同?

fly*_*lyx 16

文档本身说两种方法都有效:

您可以使用数组或字典.

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

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

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:
Run Code Online (Sandbox Code Playgroud)

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

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

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
Run Code Online (Sandbox Code Playgroud)

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

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

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

environment:
  - "MY_VAR=some\tvalue"
Run Code Online (Sandbox Code Playgroud)

如果你只引用后面的部分它将无法工作=.同样,这可能令人困惑.

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