我想从 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”,所以它可能是一个稍微迭代的过程。
刚才我需要提取文件时我所做的是:
确定您感兴趣的文件最近更改的图像版本(您如何执行此操作可能取决于您的图像),以及它的创建/保存日期
使用以下命令从命令的输出中获取完整的目录
docker save
:docker 保存 IMAGE_NAME |焦油-tvf-
layer.tar
在该命令的输出中查找与您在步骤 1 中确定的图像日期匹配的文件。(您可以添加| grep layer.tar
以仅显示这些文件)将该
layer.tar
文件提取到标准输出,并获取其目录:docker 保存 IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar |焦油-tvf-
验证您想要的文件是否已列出,并在找到名称后将其解压缩:
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