如何在 Dockerfile 中发表评论?

Posted

技术标签:

【中文标题】如何在 Dockerfile 中发表评论?【英文标题】:How do I make a comment in a Dockerfile? 【发布时间】:2016-08-11 03:55:49 【问题描述】:

我正在编写一个 Dockerfile。有没有办法在这个文件中制作 cmets?

Docker 是否有一个注释选项,它会占用一行的其余部分并忽略它?

【问题讨论】:

我发现如果一个层被缓存了,注释掉它没有效果:如果已经缓存了,Docker 会继续构建注释掉的层。 【参考方案1】:

您可以在行首使用# 来开始comment(# 之前的空格是允许的):

# do some stuff
RUN apt-get update \
    # install some packages
    && apt-get install -y cron

字符串中间的#'s 被传递给命令本身,例如:

RUN echo 'we are running some # of cool things'

【讨论】:

那么第二个问题的答案是,“Docker 是否有一个注释选项,它会占用一行的其余部分并忽略它?”,是不是? “Docker treats lines that begin with # as a comment”. 您能否更新您的答案并使其更全面/完整?比如回答第二个问题。 BMitch's answer 填写此答案中缺少的关键信息。 链接到***.com/questions/53564598/…【参考方案2】:

Dockerfile cmets 以 # 开头,就像 Python 一样。 kstaken has good examples:

# Install a more-up-to date version of MongoDB than what is included in the default Ubuntu repositories.

FROM ubuntu
MAINTAINER Kimbro Staken

RUN apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
RUN echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | tee -a /etc/apt/sources.list.d/10gen.list
RUN apt-get update
RUN apt-get -y install apt-utils
RUN apt-get -y install mongodb-10gen

#RUN echo "" >> /etc/mongodb.conf

CMD ["/usr/bin/mongod", "--config", "/etc/mongodb.conf"] 

【讨论】:

是的,但与 Python 不同的是,该行的其余部分不是在行的开头有一个命令吗?您可能想更新您的答案。 请注意:MAINTAINER 已弃用,现在建议使用标签:LABEL maintainer="foo@abc.com"【参考方案3】:

对 cme​​ts 使用 # 语法

发件人:https://docs.docker.com/engine/reference/builder/#format

# My comment here
RUN echo 'we are running some cool things'

【讨论】:

但是我们可以在与 RUN、COPY、MAINTAINER 等相同的行上发表评论吗? @AlexanderMills 是的,根据我链接到内联 cmets 的文档是有效的ADD . $foo # ADD . /bar @AlexanderMills 请注意,更改行尾的注释将导致 docker 在 docker build 上重新运行该行,因为“行已更改”。这可能有用和/或烦人 很好,也许docker应该忽略评论lol 这既是一个特性也是一个bug,我猜Docker会认为它是一个特性,我认为这实际上是有道理的【参考方案4】:

正如其他人所提到的,cmets 用# 引用,并且是documented here。但是,与某些语言不同,# 必须位于行首。如果它们出现在该行的中途,它们将被解释为一个参数,并可能导致意外的行为。

# This is a comment

COPY test_dir target_dir # This is not a comment, it is an argument to COPY

RUN echo hello world # This is an argument to RUN but the shell may ignore it

还应注意parser directives 最近已添加到 Dockerfile 中,其语法与注释相同。它们需要出现在文件顶部,在任何其他 cmets 或命令之前。最初,添加此指令是为了更改转义字符以支持 Windows:

# escape=`

FROM microsoft/nanoserver
COPY testfile.txt c:\
RUN dir c:\

第一行虽然看起来是注释,但它是一个解析器指令,用于将转义字符更改为反引号,以便COPYRUN 命令可以在路径中使用反斜杠。解析器指令也与BuildKit 一起使用,以使用syntax 行更改前端解析器。请参阅experimental syntax,了解有关如何在实践中使用它的更多详细信息。

使用多行命令,注释的行将被忽略,但您需要单独注释掉每一行:

$ cat Dockerfile
FROM busybox:latest
RUN echo first command \
# && echo second command disabled \
 && echo third command

$ docker build .
Sending build context to Docker daemon  23.04kB
Step 1/2 : FROM busybox:latest
 ---> 59788edf1f3e
Step 2/2 : RUN echo first command  && echo third command
 ---> Running in b1177e7b563d
first command
third command
Removing intermediate container b1177e7b563d
 ---> 5442cfe321ac
Successfully built 5442cfe321ac

【讨论】:

+1 用于提及“必须在行首”。续行呢?如果注释行以 \ 结尾,那么下一行是否也是注释?换句话说,如果要注释掉多行命令,是所有行都需要以# 开头还是只需要第一行?一项实验表明它是前者。可以更新此答案以涵盖该问题(使其更加出色)。 @PeterMortensen 每行都需要注释,docker 完全忽略了换行之前的所有内容。令我感兴趣的是,多行命令可以跨越 cmets。 对于那些考虑编辑文章以进行语法高亮的人,请注意,上面的大多数代码块是 Dockerfiles,而不是 bash 脚本,其中语法高亮只会分散文章的重点。【参考方案5】:

格式

这是Dockerfile:的格式

我们可以使用#进行评论,例如#COMMENT

#FROM microsoft/aspnetcore
FROM microsoft/dotnet
COPY /publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "WebApp.dll"]

从上面的文件中,当我们构建 docker 时,它会跳过第一行并转到下一行,因为我们使用 # 对其进行了注释

【讨论】:

【参考方案6】:

Docker 将 # 开头的行视为注释,除非 line 是一个有效的解析器指令。 # 标记在一行中的任何其他位置 被视为参数。

示例代码:

# this line is a comment

RUN echo 'we are running some # of cool things'

输出:

we are running some # of cool things

【讨论】:

【参考方案7】:
# this is comment
this isn't comment

是这样做的方法。您可以将它放在行中的任何位置,后面的任何内容都将被忽略

【讨论】:

以上是关于如何在 Dockerfile 中发表评论?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Postman 中发表评论

您如何在 Liquid 中发表评论?

如何在 HAML 中发表评论

如何在活动流中发表评论? (如脸书)

客户发表评论时如何订阅 facebook webhook 事件

如何在我的 JS 文件中发表评论?使用 HTML 语法错误和 JS 错误? [复制]