Answers:
您可以使用以下命令从图像中提取文件:
docker create $image # returns container ID
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
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
以上都不对我有用。完整的工作命令是:
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
不带引号cat
的传递不带文件名,因此它不知道显示什么。在命令完成后删除容器也是一个好主意。
如果我没记错的话,我相信Docker容器确实会存储在以下目录中为Ubuntu创建的缓存文件:
/var/lib/docker/aufs/diff/<container_id>
从那里,您应该能够访问文件系统并检索您的文件。
layersize
和json
,并且用户也不可读(即使用户在docker组中)。/var/lib/docker/aufs/diff
将包含我要查找的文件(但未按容器ID进行分类),并且也不可读。
/var/lib/docker/aufs
(但不能访问中的所有其他目录/var/lib/docker/
)
如果docker save
无法存储的完整输出,则可以使用管道从中提取所需的文件。
不幸的是,由于输出是“焦油焦油”,因此它可能是一个稍微迭代的过程。
我刚才需要提取文件时做的是:
1)确定您感兴趣的文件最近更改过的图像版本(此操作可能取决于图像)以及创建/保存的日期
2)使用以下docker save
命令从命令的输出中获取完整的目录:
docker save IMAGE_NAME | tar -tvf -
3)layer.tar
在该命令的输出中对与您在步骤1中确定的图像的日期相匹配的| grep layer.tar
文件进行细化。(可以添加以仅显示这些文件)
4)将该layer.tar
文件提取到标准输出中,并获取其目录:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -
5)确认列出了所需文件,并在找到名称后将其解压缩:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE
如果layer.tar
在步骤2/3中有多个文件与您要查找的日期相匹配,则可能需要对每个文件重复步骤4,直到找到正确的文件为止。
用您的情况的正确图像名称,校验和和文件名替换上述命令中大写字母的文本。