> For the complete documentation index, see [llms.txt](https://camelgemonion.gitbook.io/docker/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://camelgemonion.gitbook.io/docker/dockerfile-zhi-ling/.dockerignore-file.md).

# .dockerignore file

在**Docker CLI**将上下文发送到**Docker守护进程**之前，它将在上下文的根目录中查找名&#x4E3A;**.dockerignore**的文件。如果此文件存在，则**CLI**会修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免将较大或敏感的文件和目录发送到守护进程，并避免使用**ADD**或**COPY**将它们添加到镜像中。

**CLI**&#x5C06;**.dockerignore**文件解释为以换行符分隔的与**Unix shell**的文件通配符类似的模式列表。为了匹配，上下文的根被认为是工作目录和根目录。例如，模&#x5F0F;**/foo/bar**和**foo/bar**都在**PATH**的**foo**子目录中或位于**URL**的**git存储库**的根目录中排除名为**bar**的文件或目录。两者都不排除其他任何东西。

如&#x679C;**.dockerignore**文件中的行&#x4EE5;**#**&#x5F00;头，则该行被视为注释，并且在**CLI**解&#x91CA;**.dockerignore**之前将被忽略。

.**dockerfileignore**文件示例：

```
# comment
*/temp*
*/*/temp*
temp?
```

**.dockerignore**会产生以下的构建行为：

| Rule             | Behavior                                                                                                    |
| ---------------- | ----------------------------------------------------------------------------------------------------------- |
| **#comment**     | 注释被忽视                                                                                                       |
| **\*/temp\***    | 在根目录的当前子目录中排除名称以**temp**开头的文件和目录。例如，排除了纯文本文&#x4EF6;**/somedir/temporary.txt**，以及目&#x5F55;**/somedir/temp**。 |
| **\*/\*/temp\*** | 在根目录的二级子目录中排除名称以**temp**开头的文件和目录。 例如 **/somedir/subdir/temporary.txt**                                      |
| **temp?**        | 排除根目录中名称为**temp**的一个字符扩展的文件和目录。例如，排&#x9664;**/tempa**&#x548C;**/tempb**。                                   |

匹配是通过**Go**的**filepath.Match**规则完成的。预处理步骤删除了头部和尾部的空格，并使用**Go**的**filepath.Clean**消除&#x4E86;**.和..**&#x5143;素。预处理后，空白的行将被忽略。

除了**Go**的**filepath.Match**规则之外，**Docker**还支持特殊的**通配符字符串\****，*&#x8BE5;字符串可以匹配任意数量的目录（包括零个）*。*&#x4F8B;&#x5982;*，**\*\*/***。**go**将排除在所有目录（包括构建上下文的根目录）中找到的&#x4EE5;**.go**结尾的文件。

&#x4EE5;**!开头**的行可用于指定不需要排除的文件或目录。以下是使用此机制的示例

.**dockerignore文件**：

```
*.md
!README.md
```

当前上下文中的所有**markdown**文件都不会被排除，除了**README.md**文件

```
*.md
!README*.md #不会影响最后一行的模式匹配，因为不是位于文件的最后一行。
README-secret.md # 虽然与上一行的模式匹配，但是位于文件的最后一行，所以依然会被排除。
```

**markdown**文件不会包含在当前上下文目录中，除了**README**文件，**README-secret.md**也不会包含在上下文目录中

现在考虑以下示例：

```
*.md
# 空行会被忽略
README-secret.md #出现在!开头的模式的前面，因此!README.md模式依然会对该行起作用，所以README-secret.md文件会被包含在上下文中。

!README*.md #会对上一行的模式匹配起作用，因为位于文件最后一行。
```

所有的**README**文件都会被包含在上下文中。中间的行不会起作用，因&#x4E3A;**!README\*.md**出现在最后一行。

我们甚至可以使&#x7528;**.dockerignore**文件来排除**Dockerfile**&#x548C;**.dockerignore**文件。这些文件仍被发送到**docker**守护进程。因为仍然需要它们来帮助完成构建镜像的任务。但是**ADD**和**COPY指令**不会将它们复制到镜像中。

最后，我们可能想要指定需要包含在上下文中的文件，而不是要排除的文件。为此，&#x5C06;**\***&#x6307;定为第一个模式，然后指定一个或多&#x4E2A;**!模式**。

**Note：**

因为历史原因，**.通配符**会被忽略 。
