Dockerfile注释中的散列"#"是否需要在第1列?

And*_*dge 5 docker dockerfile

我已经看过如何在Dockerfile中发表评论?它没有回答这个问题.

泊坞窗文档关于在Dockerfile哈希的位置是一把双刃剑:

Docker将以#开头的行视为注释

目前尚不清楚是否允许哈希之前的空格.我的测试似乎表明它是允许的,但我正在寻找一个确定的答案.

关于文件中散列的位置,同一页面是明确的.dockerignore:

如果.dockerignore文件中的一行以第1列中的#开头,则该行被视为注释,并在CLI解释之前被忽略.

缺乏歧义似乎暗示相同并不适用于Dockerfile注释.

Tsc*_*cka 4

查看 Docker CLI 文件:

文件解析器第 45 行我们发现

line := strings.TrimLeftFunc(string(scannedBytes), unicode.IsSpace)
Run Code Online (Sandbox Code Playgroud)

它从左侧修剪空白区域。因此,如果非第一个空格字符是 a ,#那么它将被视为左侧修剪后面的任何代码的注释。

isSpace函数检查以下字符

'\t'、'\n'、'\v'、'\f'、'\r'、' '、U+0085 (NEL)、U+00A0 (NBSP)。

这些都将被第 45 行的代码删除,直到遇到不符合这些规范的字符。

# Nothing trimmed
           # 1 tab 7 spaces trimmed
    0 # 4 spaces trimmed
Run Code Online (Sandbox Code Playgroud)

然后在第 48 行我们找到它测试是否是注释的位置

  if len(line) > 0 && !strings.HasPrefix(line, "#") {
Run Code Online (Sandbox Code Playgroud)

因此,任何被strings.TrimLeftFunc删除的空格字符都不会“使”注释“无效”。

因此,关于您的问题,Dockerfile 注释中的哈希“#”是否需要位于第 1 列?答案是否定的,它前面可以有空格字符,但仍然是注释。

# Nothing trimmed   < -- comment
# 1 tab 7 spaces trimmed < -- comment
0 # 4 spaces trimmed  < -- not a comment
Run Code Online (Sandbox Code Playgroud)