Docker compose YAML、Docker Compose、Spaces&;引用

Docker compose YAML、Docker Compose、Spaces&;引用,docker-compose,yaml,Docker Compose,Yaml,在什么情况下必须在YAML文件中使用引号,特别是在使用docker compose时 比如说, service: image: "my-registry/repo:tag1" environment: ENV1: abc ENV2: "abc" ENV3: "a b c" 例如,如果需要空格,必须在环境变量周围使用引号,如ENV3?中所述,在谷歌搜索之后,我发现了一个 这涉及到我所理解的这个问题 我将在这里引用最重要的部分: plain scalars: - a

在什么情况下必须在YAML文件中使用引号,特别是在使用
docker compose时

比如说,

service:
  image: "my-registry/repo:tag1"
  environment:
    ENV1: abc
    ENV2: "abc"
    ENV3: "a b c"

例如,如果需要空格,必须在环境变量周围使用引号,如
ENV3

中所述,在谷歌搜索之后,我发现了一个 这涉及到我所理解的这个问题

我将在这里引用最重要的部分:

plain scalars:
- a string
- a string with a \ backslash that doesn't need to be escaped
- can also use " quotes ' and $ a % lot /&?+ of other {} [] stuff

single quoted:
- '& starts with a special character, needs quotes'
- 'this \ backslash also does not need to be escaped'
- 'just like the " double quote'
- 'to express one single quote, use '' two of them'

double quoted:
- "here we can use predefined escape sequences like \t \n \b"
- "or generic escape sequences \x0b \u0041 \U00000041"
- "the double quote \" needs to be escaped"
- "just like the \\ backslash"
- "the single quote ' and other characters must not be escaped"

literal block scalar: |
  a multiline text
  line 2
  line 3

folded block scalar: >
  a long line split into
  several short
  lines for readability
此外,我还没有见过这样的docker compose语法来设置env变量。建议使用简单的值,如

environment:
  - ENV1=abc
  - "ENV2=abc"
根据我前面所说的,在这个特定示例中,引号
是可选的


要了解如何在env变量中包含空格,您可以查看此

是否需要引号,这取决于解析器。Docker compose AFAIK仍然依赖于PyYAML模块,该模块实现了大部分YAML 1.1,并且有一些自己的怪癖

一般来说,您只需要引用可能被误解或与某些YAML构造冲突的非标量字符串。对于无法用纯标量、单引号标量或块样式文字或折叠标量表示的内容,您还需要(双)引号

曲解 您需要引用与某些其他数据结构类似的字符串:

  • 布尔值:“True”、“False”,但PyYAML也假定“Yes”、“No”、“On”、“Off”等替代词表示布尔值(也应考虑所有小写、所有大写版本)。请注意,YAML 1.2标准删除了对这些替代词的引用
  • 整数:这包括仅由数字组成的字符串。但也包括十六进制(
    0x123
    )和八进制数(
    0123
    )。YAML 1.2中的八进制写为
    0o123
    ,但PyYAML不支持这一点,但最好同时引用这两个。 PyYAML仍然支持但又不在YAML 1.2规范中的一个特殊整数是sexagesimals:以冒号(
    )分隔的基数60数字、时间指示,但如果冒号之间/之后的值在00-59范围内,则MAC地址也可以解释为这样
  • 浮点:像
    1E3
    (带可选符号ans尾数)这样的字符串应该被引用。当然,如果3.14是字符串,也需要被引用。并且sexagesimal浮点(尾数在最后一个冒号后面)也应该被引用
  • 时间戳:
    2001-12-15T02:59:43.1Z
    但也应引用类似iso-8601的字符串,以防止它们被解释为时间戳
  • null
    值作为空字符串写入,如
    ~
    null
    (在所有套管类型中),因此需要引用与之匹配的任何字符串
上面的引号可以使用单引号或双引号,也可以使用块样式的文字标量或折叠标量。请注意,对于块样式,您应该分别使用
-
-
,以免引入不在原始字符串中的尾随换行符

冲突 YAML为某些字符或字符组合赋予特殊含义。其中一些字符或字符组合仅在字符串开头具有特殊含义,其他字符或字符组合仅在字符串内具有特殊含义

  • 集合
    !&*?{[
    中的字符通常表示特殊的YAML结构。其中一些可能会根据以下字符消除歧义,但我不依赖于此
  • 空格后跟
    #
    表示行尾注释
  • 只要一个键是可能的(在许多地方的块模式中),冒号+空格(
    )的组合表示后面会有一个值。如果该组合是标量字符串的一部分,则必须引用
与曲解一样,可以使用单引号、双引号、块样式文字标量或折叠标量。在块样式标量的第一行之外不能有行尾注释

PyYAML还可能被纯标量中的任何冒号+空格(即使是在值中)弄糊涂,所以请始终引用这些冒号+空格

代表特殊字符 您可以在YAML文件中插入特殊字符或unicode代码点,但如果您希望这些字符在所有情况下都清晰可见,则可能需要使用转义序列。在这种情况下,您必须使用双引号,这是唯一可以使用的模式 允许反斜杠转义。例如
\u2029
。可以从中获取此类转义的完整列表,但请注意,PyYAML没有实现例如
\/
(或者至少在我分叉该库时没有实现)



找出引用什么或不引用什么的一个技巧是使用用于转储您拥有的字符串的库。docker compose使用的My
ruamel.yaml
和PyYAML,当可能转储纯标量时,两者都尝试回读(是的,通过解析结果)字符串的纯标量表示,如果这导致与字符串不同,则需要使用引号。您也可以这样做:当有疑问时,编写一个小程序,使用PyYAML的
safe_dump()转储您拥有的字符串列表
并在PyYAML所做的任何地方应用引号。

感谢这一点,即docker compose环境中使用的样式,他们的文档在此处显示了两种样式: