Docker保存/load lose original image repository/name/tag

umuewwlo  于 2023-06-21  发布在  Docker
关注(0)|答案(7)|浏览(139)

使用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

为什么它会有这种行为,我如何保持原来的图像名称?

rkttyhzu

rkttyhzu1#

使用

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
4c8rllxm

4c8rllxm2#

我遇到了同样的问题,所以我使用以下命令手动修复它:
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

保存图像+父项,不创建存储库文件。保存仅与图像相关,并且标签被设计为省略,并留给用户作为练习,以根据他们自己的命名约定填充。
Reference

yptwkmov

yptwkmov3#

这是一个变通方案
1.转到源Docker主机,使用以下命令docker image ls > images.txt创建包含所有图像详细信息的文本文件
1.上面的命令将生成一个类似于以下REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 293e4ed402ba 2 weeks ago 315MB <none> <none> d8e4b0afd6ba 2 weeks ago 551MB的文本文件
1.使用docker image tag命令进行必要的编辑以设置标记
docker image tag 293e4ed402ba postgres:latest docker image tag d8e4b0afd6ba wordpress:latest

gzjq41n4

gzjq41n44#

一个图像ID可以有多个名称/标签,因此,在将图像保存并加载到tar ball/从tar ball加载图像后,我希望会发生的是您丢失名称和标签的方式。
模式细节在关于它的讨论中here

aij0ehis

aij0ehis5#

Docker文档:

cat exampleimage.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

这个对我很有效。

p4rjhz4m

p4rjhz4m6#

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@latest@4f41f23e6002.tar
# docker save 9c7a54a9a43c -o hello-world@latest@9c7a54a9a43c.tar
# docker save cc44224bfe20 -o nginx@alpine@cc44224bfe20.tar
# docker save f9e320b7e19c -o rancher+rancher@latest@f9e320b7e19c.tar


function docker_image_import(){
  ls *@*.tar | while read line
  do 
    # phase filename
    # delete .tar # mcr.microsoft.com+powershell@latest@4f41f23e6002.tar --> 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@latest@9c7a54a9a43c.tar
# docker tag 9c7a54a9a43c hello-world:latest
# docker import mcr.microsoft.com+powershell@latest@4f41f23e6002.tar
# docker tag 4f41f23e6002 mcr.microsoft.com/powershell:latest
# docker import nginx@alpine@cc44224bfe20.tar
# docker tag cc44224bfe20 nginx:alpine
# docker import rancher+rancher@latest@f9e320b7e19c.tar
# docker tag f9e320b7e19c rancher/rancher:latest
olmpazwi

olmpazwi7#

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

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

请注意,当找到所有tar文件时,您应该在该文件夹中。

相关问题