从docker镜像中提取文件?

从docker镜像中提取文件?

我想从 Docker 映像中提取文件,而无需运行该映像。

docker save选项目前对我来说不是一个可行的选择,因为它保存了太大的文件只是为了解压缩特定文件。

答案1

您可以使用以下命令从图像中提取文件:

container_id=$(docker create "$image")
docker cp "$container_id:$source_path" "$destination_path"
docker rm "$container_id"

根据docker create 文档,这不会运行容器:

docker create命令在指定的映像上创建一个可写容器层,并准备其运行指定的命令。然后将容器 ID 打印到STDOUT.这与docker run -d容器从未启动类似。然后,您可以docker start <container_id>随时使用该命令启动容器。


作为参考(我之前的答案),从图像中提取文件的效率较低的方法如下:

docker run some_image cat "$file_path" > "$output_path"

答案2

docker save如果无法存储完整的输出,您可以使用管道从中提取所需的文件。

不幸的是,因为输出是“tar of tars”,所以它可能是一个稍微迭代的过程。

刚才我需要提取文件时我所做的是:

  1. 确定您感兴趣的文件最近更改的图像版本(您如何执行此操作可能取决于您的图像),以及它的创建/保存日期

  2. 使用以下命令从命令的输出中获取完整的目录docker save

    docker 保存 IMAGE_NAME |焦油-tvf-

  3. layer.tar在该命令的输出中查找与您在步骤 1 中确定的图像日期匹配的文件。(您可以添加| grep layer.tar以仅显示这些文件)

  4. 将该layer.tar文件提取到标准输出,并获取其目录:

    docker 保存 IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar |焦油-tvf-

  5. 验证您想要的文件是否已列出,并在找到名称后将其解压缩:

    docker 保存 IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - 路径/到/您的/文件

如果有多个layer.tar文件与您在步骤 2/3 中查找的日期相匹配,您可能需要对每个文件重复步骤 4,直到找到正确的文件

将上述命令中的大写文本替换为适合您情况的正确图像名称、校验和和文件名。

答案3

以上都不适合我。完整的工作命令是:

docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename

没有引号cat就传递没有文件名,因此它不知道要显示什么。另外,在命令完成后删除容器也是一个好主意。

答案4

这是另一个选项,它甚至不创建容器并避免手动摆弄图层,但如果多个图层包含您感兴趣的一些文件,则可能会很有趣:

$ docker image save IMAGE_NAME | tar --extract --wildcards --to-stdout '*/layer.tar' | tar --extract --ignore-zeros --verbose FILE_OR_DIRECTORY

相关内容