如何测试dockerignore文件?

Édo*_*pez 36 shell ignore node-modules docker

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

例子

**/node_modules/
Run Code Online (Sandbox Code Playgroud)

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

BMi*_*tch 58

为了扩展VonC的建议,这里有一个示例/build-context和一组构建/运行命令,您可以使用它们创建一个包含当前文件夹构建上下文的容器(命名.dockerignore为避免与您的项目冲突/build-context):

docker image build -t build-context -f - . <<EOF
FROM busybox
COPY . /build-context
WORKDIR /build-context
CMD find .
EOF
Run Code Online (Sandbox Code Playgroud)

创建后,在命令行中执行以下命令:

# 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
Run Code Online (Sandbox Code Playgroud)

将上述内容复制/粘贴到提示时,该.dockerignore命令将输出复制到Docker主机的/build-context文件未被文件忽略的文件.


Sek*_*nre 46

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

因此,这是在不实际复制数据的情况下测试的方法.dockerignore:

$ rsync -avn . /dev/shm --exclude-from .dockerignore
Run Code Online (Sandbox Code Playgroud)

这样做的目的是尝试将当前目录与内存中的空文件夹/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)
Run Code Online (Sandbox Code Playgroud)

将其添加到.dockerignore:

*.bogus
Run Code Online (Sandbox Code Playgroud)

并再次测试:

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)
Run Code Online (Sandbox Code Playgroud)

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

编辑:我发现了一个区别。对于 rsync,该模式*.bogus匹配具有该名称的所有文件,无论目录如何。.dockerignore但仅匹配*.bogus当前目录。要获得相同的行为,您需要在模式前添加路径 glob 字符作为前缀,**/*.bogus这仍然适用于 rsync。

  • 这就是我一直在寻找的优雅且快速的解决方案。谢谢! (9认同)
  • 您还可以向 rsync 添加一个“h”标志(如“rsync -avnh”),以便输出更易于理解。 (5认同)
  • 您先生,用您的大脑让我度过了愉快的一天! (4认同)
  • 这个答案对我来说价值 5.43GB (2认同)

Luc*_*cas 24

To expand on BMitch's answer (which implements VonC's answer), you can do it with one simple command:

# 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
Run Code Online (Sandbox Code Playgroud)

Switching from CMD to RUN means you don't have to ever run the container as the build will output the result of the find ..


J.M*_*ney 16

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

$ go get -v -u github.com/pwaller/docker-show-context
$ cd ~/path/to/project/using/docker
$ docker-show-context
Run Code Online (Sandbox Code Playgroud)

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


Rom*_*zha 9

要扩展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
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 5

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

尝试在node_modules文件夹中添加或复制文件:该操作失败,原因可能是.dockerignore。


小智 5

为了扩展 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
Run Code Online (Sandbox Code Playgroud)

其输出:

#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
...
Run Code Online (Sandbox Code Playgroud)