如何测试 dockerignore 文件?

How to test dockerignore file?

看了.dockerignore documentation,想知道有没有办法测试一下?

例子

**/node_modules/

如何检查我的 dockerfile 是否忽略了正确的文件和目录?

一种方法是制作一个带有 ADD or COPY 指令的小 Dockerfile。

尝试在 node_modules 文件夹中添加或复制文件:它没有成功,那是因为 .dockerignore.

要详细分析构建上下文,您可以使用 pwaller/docker-show-context

$ go get -v -u github.com/pwaller/docker-show-context
$ cd ~/path/to/project/using/docker
$ docker-show-context

它输出有关构建的统计信息,例如文件大小和上传时间。

为了扩展 ,这里有一个示例构建命令,您可以使用它来使用当前文件夹的构建上下文创建图像:

docker image build --no-cache -t build-context -f - . <<EOF
FROM busybox
WORKDIR /build-context
COPY . .
CMD find .
EOF

创建后,运行 容器并检查 /build-context 目录的内容,其中包括 .dockerignore 文件未排除的所有内容:

# run the default find command
docker container run --rm build-context

# or inspect it from a shell using
docker container run --rm -it build-context /bin/sh

然后您可以使用以下方式进行清理:

docker image rm build-context

要扩展 's answer (which implements 的答案),您可以使用一个简单的命令来完成:

# no cache to ensure output
# progress plain in case you are using buildkit
docker build --no-cache --progress plain --file - . <<EOF
FROM busybox
COPY . /build-context
WORKDIR /build-context
RUN find .
EOF

CMD 切换到 RUN 意味着您不必 运行 容器,因为构建将输出 find . 的结果。

为了扩展 answer which expands on 's answer (which implements 的答案),如果您使用的是 buildx,您还需要通过添加 --progress plain 来设置进度输出的类型,当然不要忘记 --no-cache:

docker build --no-cache --progress plain -f - . <<EOF
FROM busybox
COPY . /build_context
WORKDIR /build_context
RUN find .
EOF

其他答案没有考虑的一件事是,这可能会复制许多千兆字节的数据并且速度非常慢,而您只想找出需要排除的文件以减少图片大小。

下面是如何在不实际复制数据的情况下测试 .dockerignore

$ rsync -avn . /dev/shm --exclude-from .dockerignore

这样做的目的是尝试将当前目录与空 in-memory 文件夹 /dev/shm 详细同步,并且 dry-run(实际上不要复制任何内容)--exclude-from 选项以与 .gitignore.dockerignore

相同的格式读取 glob 模式

您最终会得到一个已复制文件的列表和一个包含总大小的摘要:

file.bogus
tests/
tests/conftest.py
tests/test_model.py

sent 1,954 bytes  received 207 bytes  4,322.00 bytes/sec
total size is 209,916,337  speedup is 97,138.52 (DRY RUN)

添加到.dockerignore:

*.bogus

再次测试:

tests/
tests/conftest.py
tests/test_model.py

sent 1,925 bytes  received 204 bytes  4,258.00 bytes/sec
total size is 201,145  speedup is 94.48 (DRY RUN)

这非常快,不会填满您的磁盘。

编辑:我发现了一个不同之处。对于 rsync,模式 *.bogus 匹配所有具有该名称的文件,而不考虑目录。 .dockerignore 但是只匹配当前目录中的 *.bogus。要获得相同的行为,您需要在模式前加上路径 glob 字符 **/*.bogus 这仍然适用于 rsync。