【问题标题】:Environment variable assignment in Docker Compose - colon wayDocker Compose 中的环境变量赋值 - 冒号方式
【发布时间】:2017-08-23 16:55:49
【问题描述】:

这是关于 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/

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

【问题讨论】:

  • 意见问题?
  • 我将使用该教程的代码并使用其他图像和其他环境变量添加一些更改,但我不知道该怎么做。或者也许我应该更好地理解完成这些任务。问题是“这合适吗”
  • 只是说我相信两者都有效,这是一个见仁见智的问题。好奇心并没有太大的问题。尝试两者,看看什么有效,你更喜欢什么。 :-)

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


【解决方案1】:

文档本身说both methods are working

您可以使用数组或字典。

现在让我们原谅 Docker 没有使用正确的术语(数组实际上是 YAML 中的 sequence,字典是 mapping)并从YAML 观点:

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

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"

如果您只引用= 之后的部分,它将不起作用。同样,这可能会令人困惑。

结论:对我来说,使用映射似乎更一致并且对用户的困惑更少,因此更可取。 ymmv。

【讨论】:

    猜你喜欢
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2018-02-03
    • 2019-02-25
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多