为了扩展 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
其他答案没有考虑的一件事是,当您想要做的只是找出需要排除哪些文件以减小图像大小时,这可能会复制许多 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。
要获得构建上下文的详细分析,您可以使用 pwaller/docker-show-context。
$ go get -v -u github.com/pwaller/docker-show-context
$ cd ~/path/to/project/using/docker
$ docker-show-context
它输出有关构建的统计信息,例如文件大小和上传时间。
为了扩展 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
...
很好的解决方案,添加到@Sekenre 的答案中。
正如他提到的,
rsync
匹配所有文件,无论*.bogus
上的目录位置如何,这意味着如果您想否定.dockerignore文件并忽略除您想要允许的内容之外的所有内容,这会导致将*
放在.dockerignore 文件的顶部,那么 rsync 方法根本不会传输任何文件,即使您对它正下方的文件有一个否定语句,但检查这一点的工具会很棒。
即使有一个 vscode 扩展来查看文件浏览器中被忽略和允许的文件也会很棒,就像 vscode 文件资源管理器中的 git 和 gitignore 一样。
除了@Sekenre答案之外,您还可以传递标志--dry-run。这将显示将复制的内容,而无需实际复制任何内容。
rsync -avn . /dev/shm --exclude-from .dockerignore --dry-run