是否可以从docker镜像中复制文件,而无需从该镜像实际运行容器

时间:2018-01-15 15:06:11

标签: docker

我想从docker镜像中复制一些文件而不实际运行该图像中的容器。有可能这样做吗?如果是,那么需要采取哪些步骤?

4 个答案:

答案 0 :(得分:6)

图像不是停靠者cp因为图像是不可变对象但是:

您可以创建非正在运行的容器:

docker create --name cont1 some-image
docker cp cont1:/some/dir/file.tmp file.tmp
docker rm cont1

图片上的docker cp的完整未接受提案位于:

https://github.com/moby/moby/issues/16079

答案 1 :(得分:0)

docker image save alpine -o alpine.tar 
解压缩,它将有一个名为hash的hash,里面有一个包含图像文件的layer.tar。

答案 2 :(得分:0)

这是一个通过容器从Docker Image复制文件的单行程序:

图像定义CMD

docker run --rm \
           -v $(pwd):/binary my-image /bin/sh -c "cp /kube-bench /binary"

图像定义ENTRYPOINT

docker run --rm --entrypoint "/bin/sh" \
           -v $(pwd):/binary kube-bench-image -c "cp /kube-bench /binary"

这两个命令都会挂载当前目录,以便将文件/kube-bench复制到它。

答案 3 :(得分:0)

如果没有CMD或入口点,则Alfonso Tienda响应不适用于图像。

jhernandez是解决方案的一个很好的起点,但是它需要提取所有文件。

那:

docker image save $IMAGE |
  tar tf - |
    grep layer.tar |
      while read layer; do
        docker image save $IMAGE | 
          tar -xf - $layer -O |
            tar -xf - $FILENAME ; done

因此,我们可以将IMAGEFILENAME设置为像以下这样提取:

$ IMAGE=alpine
$ FILENAME=etc/passwd
$ docker image save $IMAGE | tar tf - | grep layer.tar | while read layer; do docker image save $IMAGE | tar -xf - $layer -O | tar -xf - $FILENAME ; done

我们可以节省一些存储空间。