Docker 保存/加载丢失原始镜像存储库/名称/标签

问题描述 投票:0回答:8

我使用的是 Docker 1.12.6。

我已经从 Docker 注册表中提取了一个映像。 我已使用

docker save
命令将图像导出为 tar 文件。

我删除了原始图像和容器,并使用

docker load -i myImage.tar
加载导出的图像。

现在,运行时

docker images
我注意到我的图像丢失了其存储库/标签信息:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              5fae4d4b9e02        8 weeks ago         581.3 MB

为什么会出现这种行为以及如何保留原始图像名称?

docker docker-image
8个回答
45
投票

使用

docker save -o filename.tar <repo>:<tag>

命令

docker save <image id>
删除存储库和标签名称。

要解决此问题,请使用

docker save <repo>:<tag>
它将在保存的文件中保留存储库和标签名称。例如:

docker save -o ubutu-18.04.tar ubuntu:18.04

21
投票

我也遇到了同样的问题,所以我使用以下命令手动修复它:

docker tag <Image-ID> <desired Name:Tag>

参考


[注意]:

不一致:

docker save image-repo-name
->
docker load
恢复名称,
docker save SHA
->
docker load
无名称或标签,
docker save name:latest
->
docker load
没有名称或标签。

当前(且正确)的行为如下:

docker save repo

将所有标记的图像+父级保存在存储库中,并创建一个 列出标签的存储库文件

docker save repo:tag

将标记图像+父母保存在存储库中,并创建存储库文件 列出标签

docker save imageid

保存图像+父级,不创建存储库文件。保存 仅与图像相关,并且标签在设计上被省略并保留为 让用户根据自己的命名进行填充的练习 大会。

参考


2
投票

这是一个解决方法

  1. 转到源 docker 主机,使用以下命令创建包含所有图像详细信息的文本文件

    docker image ls > images.txt

  2. 上面的命令将生成一个类似于以下内容的文本文件

    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE <none>       <none>    293e4ed402ba   2 weeks ago    315MB <none>       <none>    d8e4b0afd6ba   2 weeks ago    551MB 

  3. 使用

    docker image tag
    命令进行必要的编辑以设置标签

docker image tag 293e4ed402ba postgres:latest
docker image tag d8e4b0afd6ba wordpress:latest


1
投票

单个图像 ID 可以有多个名称/标签, 所以你失去名称和标签的方式是 保存图像并将其加载到 tar 球或从 tar 球加载图像后,我期望发生什么。

模式详细信息在关于它的讨论中这里


1
投票

来自 docker 文档:

猫示例image.tgz | docker import - exampleimagelocal:new

root@mymachine:/tmp# cat myimage.tar | docker import --message "New image imported from tarball" - reponame:my-image-name
sha256:be0794427222dcb81182a59c4664b350ecb5ffb7b37928d52d72b31
root@mymachine:/tmp# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
reponame          my-image-name    be0794427222        6 seconds ago       4.31GB

这个对我有用。


0
投票
function docker_image_export(){
  docker images | grep -v REPOSITORY | while read line
  do 
    # filename:
    # <repo>:<version>:<image_id>.tar , replace:
    # / --> +
    # : --> @
    # after replace: <repo>@<version>@<image_id>.tar
    local filename=$( echo $line | awk '{print $1":"$2":"$3".tar"}' | sed 's|:|@|g ; s|/|+|g' )
    image_id=$( echo $line | awk '{print $3}' )
    echo "docker save $image_id -o ${filename}"
    docker save $image_id -o ${filename}
  done
}

# For example:
# docker save 4f41f23e6002 -o mcr.microsoft.com+powershell@[email protected]
# docker save 9c7a54a9a43c -o hello-world@[email protected]
# docker save cc44224bfe20 -o nginx@[email protected]
# docker save f9e320b7e19c -o rancher+rancher@[email protected]



function docker_image_import(){
  ls *@*.tar | while read line
  do 
    # phase filename
    # delete .tar # mcr.microsoft.com+powershell@[email protected] --> mcr.microsoft.com+powershell@latest@4f41f23e6002
    local filename=${line/.tar/}
    image_id=${filename##*@}
    # delete @4f41f23e6002 # mcr.microsoft.com+powershell@latest@4f41f23e6002 --> mcr.microsoft.com+powershell@latest
    filename=${filename/@$image_id/}
    local version=${filename##*@}
    # delete @latest # mcr.microsoft.com+powershell@latest --> mcr.microsoft.com+powershell
    local repo=${filename/@$version/}
    # replace + --> / # mcr.microsoft.com+powershell --> mcr.microsoft.com/powershell
    repo=$( echo ${repo} | sed 's|+|/|g' )
    echo "docker import ${line}"
    docker import ${line}
    docker tag ${image_id} "${repo}:${version}"
    echo "docker tag ${image_id} $repo:$version"
  done
}

# docker import hello-world@[email protected]
# docker tag 9c7a54a9a43c hello-world:latest
# docker import mcr.microsoft.com+powershell@[email protected]
# docker tag 4f41f23e6002 mcr.microsoft.com/powershell:latest
# docker import nginx@[email protected]
# docker tag cc44224bfe20 nginx:alpine
# docker import rancher+rancher@[email protected]
# docker tag f9e320b7e19c rancher/rancher:latest

0
投票

要自动执行此过程,请确保您之前复制了 docker 映像输出:

docker images >images.txt

然后在加载所有图像后,执行如下操作:

cat images.txt | sed '1d' | awk '{print "docker tag "$3" "$1":"$2}' | /bin/bash

如果您有带有 as 标签的图像,您需要先编辑 images.txt 以跳过这些,和/或手动完成它们。


-2
投票

我编写了一个单行脚本,导入一堆 .tar 文件并立即标记图像。

for image in $(ls); do docker tag "$(echo $(docker import  $image))" $image ; done

请注意,当所有 tar 文件都找到后,您应该位于该文件夹内。

© www.soinside.com 2019 - 2024. All rights reserved.