1. 概述

在本教程中,我们将学习如何在Dockerfile中添加注释。我们还将突出显示看起来像注释但实际上不是的指令之间的区别。

2. 添加到Dockerfile中的注释

我们将使用以下Dockerfile:

FROM ubuntu:latest
RUN echo 'This is a Baeldung tutorial'

让我们快速理解它:

  • 第一行声明我们使用最新版的ubuntu镜像
  • 第二行将echo命令作为shell参数传递

让我们构建我们的镜像

$ docker build -t baeldungimage .
#4 [1/2] FROM docker.io/library/ubuntu:latest
#5 [2/2] RUN echo 'This is a Baeldung tutorial'

Docker打印了两步成功运行的其他行(这里我们没有列出)。现在,让我们看看如何在Dockerfile中添加注释。

2.1 单行注释

要注释一行,它必须以#开头。

让我们看看如何修改Dockerfile以添加一些单行注释:

# Declare parent image
FROM ubuntu:latest
# Print sentence
RUN echo 'This is a Baeldung tutorial'

让我们构建修改后的镜像:

$ docker build -t baeldungimage .
#4 [1/2] FROM docker.io/library/ubuntu:latest
#5 [2/2] RUN echo 'This is a Baeldung tutorial'

正如预期的那样,Docker成功地运行了之前相同的两步。

2.2 多行注释

Docker中没有专门用于编写多行注释的语法。因此,编写多行注释的唯一方法是逐行编写多个单行注释

# This file is a demonstration
# For a Baeldung article
FROM ubuntu:latest
RUN echo 'This is a Baeldung tutorial'

构建镜像仍然打印与之前相同的步骤:

$ docker build -t baeldungimage .
#4 [1/2] FROM docker.io/library/ubuntu:latest
#5 [2/2] RUN echo 'This is a Baeldung tutorial'

3. 避免陷阱

在本节中,我们将查看我们应该了解的一系列陷阱。这些是一些看起来像是注释但实际上不是的代码行。

3.1 注释或命令参数?

在Docker中,不可能在指令的末尾添加注释。让我们看看如果我们尝试在Dockerfile的指令之一的末尾添加一个格式化为单行注释的句子会发生什么:

FROM ubuntu:latest
RUN echo 'This is a Baeldung tutorial' # Print sentence

我们现在将构建镜像:

$ docker build -t baeldungimage .
#4 [1/2] FROM docker.io/library/ubuntu:latest
#5 [2/2] RUN echo 'This is a Baeldung tutorial' # Print sentence
#5 0.371 This is a Baeldung tutorial

我们包括了由echo命令打印的句子,以强调结果确实与之前相同。那么发生了什么呢?我们实际上在Dockerfile的第二行末尾添加了注释吗?

实际上,# Print sentence被作为额外参数传递给RUN命令。在这种情况下,额外的参数实际上被RUN命令忽略。为了证实这一点,让我们现在在Dockerfile的第一行末尾添加类似的句子:

FROM ubuntu:latest # Declare parent image
RUN echo 'This is a Baeldung tutorial'

让我们尝试构建这个镜像:

$ docker build -t baeldungimage .
failed to solve with frontend dockerfile.v0: failed to create LLB definition: dockerfile parse error line 1: FROM requires either one or three arguments

在这里,我们得到了非常明确的错误消息,证明了我们的肯定。

3.2 解析指示符不是注释

解析指示符告诉Dockerfile解析器如何处理文件的内容。同样,解析指示符以#开头,类似于注释。

此外,我们应注意到解析指示符必须位于Dockerfile的顶部。例如,我们在文件中使用了escape解析指示符。此指示符更改了文件中使用的转义字符:

# escape=`
FROM ubuntu:latest
RUN echo 'This is a Baeldung tutorial&' `
  && echo 'Print more stuff'

在这里,我们又在RUN命令中添加了另一个echo指令。为了提高可读性,我们将此指令放在新行上。默认的行分隔符是\*。然而,由于我们使用了解析指示符,我们需要使用`*。让我们现在构建镜像并查看会发生什么:

$ docker build -t baeldungimage .
#4 [1/2] FROM docker.io/library/ubuntu:latest
#5 [2/2] RUN echo 'This is a Baeldung tutorial&' && echo 'Print more stuff'
#5 0.334 This is a Baeldung tutorial&
#5 0.334 Print more stuff

两个句子如预期一样被打印出来。

4. 结论

在这篇文章中,我们看到了如何在Dockerfile中编写注释。我们还了解到有一组称为解析指示符的指令,它们看起来与实际对文件有影响的注释非常相似。

正如往常一样,代码可以在GitHub上找到: