如何测试dockerignore文件?

问题描述 投票:0回答:9

阅读完

.dockerignore
文档后,我想知道是否有办法测试它?

示例

**/node_modules/

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

docker shell node-modules dockerignore
9个回答
163
投票

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

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

41
投票

其他答案没有考虑的一件事是,当您想要做的只是找出需要排除哪些文件以减小图像大小时,这可能会复制许多 GB 的数据并且速度非常慢。

因此,这是在不实际复制数据的情况下测试

.dockerignore
的方法:

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

这样做的目的是尝试将当前目录与空内存文件夹

/dev/shm
同步并进行空运行(实际上不复制任何内容)
--exclude-from
选项以与
相同的格式读取全局模式.gitignore
.dockerignore

您最终将看到复制的文件列表以及最后包含总大小的摘要:

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。


33
投票

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

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

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


21
投票

要扩展 BMitch 的答案(实现了 VonC 的答案),您可以使用一个简单的命令来完成:

# 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 .
的结果。


8
投票

要扩展Lucas'的答案,它扩展了BMitch的答案(实现了VonC的答案),如果您使用的是buildx,您还需要通过添加

--progress plain
来设置进度输出的类型当然,不要忘记
--no-cache

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

7
投票

一种方法是创建一个小型 Dockerfile,其中包含 ADDCOPY 指令。

尝试在

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


3
投票

为了扩展 Lucas 的答案(实现了 BMitch 和 VonC 的答案),您可以通过以下方式获得更容易理解的树结构:

$ docker build --no-cache --progress plain --file - . <<EOF
FROM debian
RUN  apt update && apt install tree -y
COPY . /build-context
RUN tree /build-context
EOF

输出:

#8 0.342 /build-context
#8 0.342 |-- dirA
#8 0.342 |   |-- a
#8 0.342 |   |-- b
#8 0.342 |   |   `-- lib
#8 0.342 |   |       |-- common
#8 0.342 |   |       |   |-- __init__.py
#8 0.342 |   |       |   |-- other.py
...

0
投票

很好的解决方案,添加到@Sekenre 的答案中。

正如他提到的,

rsync
匹配所有文件,无论
*.bogus
上的目录位置如何,这意味着如果您想否定.dockerignore文件并忽略除您想要允许的内容之外的所有内容,这会导致将
*
放在.dockerignore 文件的顶部,那么 rsync 方法根本不会传输任何文件,即使您对它正下方的文件有一个否定语句,但检查这一点的工具会很棒。

即使有一个 vscode 扩展来查看文件浏览器中被忽略和允许的文件也会很棒,就像 vscode 文件资源管理器中的 git 和 gitignore 一样。


0
投票

除了@Sekenre答案之外,您还可以传递标志--dry-run。这将显示将复制的内容,而无需实际复制任何内容。

rsync -avn . /dev/shm --exclude-from .dockerignore --dry-run
© www.soinside.com 2019 - 2024. All rights reserved.