当前位置: 首页 > 知识库问答 >
问题:

docker:从图像中提取图层

司徒宇
2023-03-14

让我们以whalesay图片为例<代码>docker history显示以下内容:

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
6b362a9f73eb        17 months ago       /bin/sh -c #(nop) ENV PATH=/usr/local/bin:/us   0 B
<missing>           17 months ago       /bin/sh -c sh install.sh                        30.37 kB
<missing>           17 months ago       /bin/sh -c git reset --hard origin/master       43.27 kB
<missing>           17 months ago       /bin/sh -c #(nop) WORKDIR /cowsay               0 B
<missing>           17 months ago       /bin/sh -c git clone https://github.com/moxie   89.9 kB
<missing>           17 months ago       /bin/sh -c apt-get -y update && apt-get insta   58.58 MB
<missing>           18 months ago       /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B
<missing>           18 months ago       /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.895 kB
<missing>           18 months ago       /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
<missing>           18 months ago       /bin/sh -c #(nop) ADD file:f4d7b4b3402b5c53f2   188.1 MB

我想提取显示为ADD file:bla的层。有这样做的工具/方法吗?

共有3个答案

方博
2023-03-14

我真的不明白你所说的“提取”是什么意思,但如果你想获得有关图像的更多信息,请运行

docker inspect <image_name>

如果您想获取文件,请从此映像运行容器。试试

docker export <container_name> > abc.tar

之后,提取abc.tar并找到您的文件。

景建业
2023-03-14

看起来其他人也想拥有这个功能,但不幸的是,现在它似乎不存在。

另请参见此问题和此处被拒绝的相关请求。

如果您可以保存完整的docker(docker save),然后用图层提取一个tarball,那么这是可能的:

docker run -it <your image>
# do fancy stuff in the container
docker commit <your container> foobar # create image from container
docker history foobar # will show you the layers
docker save -o foobar.tar foobar # dumps container contents to foobar.tar

现在foobar。tar将包含不同时间的文件系统状态。在我的例子中,检查这个tarball会显示一个文件存储库

{"foobar":{"latest":"fdf43d96e691c57e9afb4b85dba2e6745146a7ca9076c7284c6b2e1f93434562"}}

这表明,最新的层是fdf43 。您可以通过以下方式获得一个包含该层文件系统内容的tarball

tar -x fdf43d96e691c57e9afb4b85dba2e6745146a7ca9076c7284c6b2e1f93434562/layer.tar -f foobar.tar

有一个工具undocker可以自动执行此过程,但我不确定它是否适用于保存的tar文件的当前格式。

宋耀
2023-03-14

在这种特定情况下,看起来ADD命令将基本映像添加到文件系统中。如果您运行docker历史记录--no-trunc docker/whalesay,完整的命令是:

/bin/sh -c #(nop) ADD file:f4d7b4b3402b5c53f266bb7fdd7e728493d9a17f9ef20c8cb1b4759b6e66b70f in /

docker history报告特定层为188MB。让我们更详细地了解这些层:

$ docker save docker/whalesay -o whalesay.tar
$ tar tvf whalesay.tar

...
-rw-r--r-- 0/0       197181952 2015-05-25 22:04 cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar
...

看起来是一个很好的候选人!您现在可以提取该层并从中提取文件。

$ tar xf whalesay.tar cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar
$ tar xf cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar etc/passwd

如果您想从图层中提取特定文件,但不知道是哪一层,您可以这样做。首先,提取所有图层:

$ tar xf whalesay.tar

现在您将所有图层作为单独的. tar文件。让我们找到一个文件:

$ for layer in */layer.tar; do tar -tf $layer | grep docker.cow && echo $layer; done
usr/local/share/cows/docker.cow
0523c5a0c4588dde33d61d171c41c2dc5c829db359f4d56ab896ab1c185ed936/layer.tar
cowsay/cows/docker.cow
40e8ae7bb4e5b9eaac56f5be7aa614ed50f163020c87ba59e905e01ef0af0a4f/layer.tar
cowsay/cows/docker.cow
f9bc8676543761ff3033813257937aeb77e9bc84296eaf025e27fe01643927cf/layer.tar

最后,从所需图层中提取文件:

$ tar xf 0523c5a0c4588dde33d61d171c41c2dc5c829db359f4d56ab896ab1c185ed936/layer.tar \
      usr/local/share/cows/docker.cow

这将提取具有相对于当前目录的完整路径的文件。

$ cat usr/local/share/cows/docker.cow 
##
## Docker Cow
##
$the_cow = <<EOC;
    $thoughts
     $thoughts
      $thoughts     
                    ##        .            
              ## ## ##       ==            
           ## ## ## ##      ===            
       /""""""""""""""""\___/ ===        
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
       \\______ o          __/            
        \\    \\        __/             
          \\____\\______/   
EOC
 类似资料:
  • 我在AWS上使用Kubernetes来运行一个Play+Akka流服务器。 执行时 我的吊舱进入“ImagePullBackoff”状态。 以下是事件列表: 但是,映像存在于存储库中--执行: 在我的机器上工作。 现在,这个节点上还有其他的豆荚在运行。

  • 我有车牌图像(图像像这些示例图像一样被裁剪)。我只想从输入图像中提取印版。 我已经应用了OpenCV Canny边缘检测器,但我不能再进一步了。有人能帮我吗? 我的最终目标是用我的公司标志替换这个标牌。 车牌图像示例:

  • 我得到以下错误 服务器:版本:1.12.6 API版本:1.24 Go版本:Go1.6.4 Git提交:78D1802构建:1月10日星期二20:20:01 2017 OS/arch:Linux/AMD64

  • 假设我的用户去了他们办公室的扫描仪。扫描仪能够生成扫描文档的PDF。这基本上就是我拥有的文件类型。 我想做的是从这个PDF中提取文本。这不是“第一代”pdf,因为文本没有嵌入到pdf中。文本嵌入在PDF中的图像中。 PDFBox的iText中是否有允许检索此数据的功能?如果可能的话,我正在尝试避免对图像进行OCR。我希望IText或PDFBox中有一些内置的东西可以做到这一点。 请注意,我不是在谈

  • 我知道以前也有人问过类似的问题,但是这些问题已经过时了(有些问题可以追溯到2006年)。 我有一个. net 3.5应用程序(w/iTextSharp 5),我正在转换为. net核心(iText 7),它从联邦快递跟踪文档中提取签名,通过SOAP服务以字节[]数组发送。这段代码多年来一直运行良好,只是略有更新。从联邦快递返回的PDF文档中有几个图像,但签名块不是110x46图像(这是pdf文件中

  • 我正在reddit API中寻找示例。我想从某个subreddit(http://www.reddit.com/r/VillagePorn)中提取图像并将它们放在网页上。我见过其他网站这样做(主要是),我不知道怎么做。 我试过,但只返回图片的缩略图。甚至链接本身也没有。 我该怎么办?