如何测试 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。
看了.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
要扩展
# 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 .
的结果。
为了扩展 --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
您最终会得到一个已复制文件的列表和一个包含总大小的摘要:
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。