我使用的是 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 save -o filename.tar <repo>:<tag>
命令
docker save <image id>
删除存储库和标签名称。
要解决此问题,请使用
docker save <repo>:<tag>
它将在保存的文件中保留存储库和标签名称。例如:
docker save -o ubutu-18.04.tar ubuntu:18.04
我也遇到了同样的问题,所以我使用以下命令手动修复它:
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
保存图像+父级,不创建存储库文件。保存 仅与图像相关,并且标签在设计上被省略并保留为 让用户根据自己的命名进行填充的练习 大会。
这是一个解决方法
转到源 docker 主机,使用以下命令创建包含所有图像详细信息的文本文件
docker image ls > images.txt
上面的命令将生成一个类似于以下内容的文本文件
REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 293e4ed402ba 2 weeks ago 315MB <none> <none> d8e4b0afd6ba 2 weeks ago 551MB
使用
docker image tag
命令进行必要的编辑以设置标签
docker image tag 293e4ed402ba postgres:latest
docker image tag d8e4b0afd6ba wordpress:latest
单个图像 ID 可以有多个名称/标签, 所以你失去名称和标签的方式是 保存图像并将其加载到 tar 球或从 tar 球加载图像后,我期望发生什么。
模式详细信息在关于它的讨论中这里
来自 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
这个对我有用。
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
要自动执行此过程,请确保您之前复制了 docker 映像输出:
docker images >images.txt
然后在加载所有图像后,执行如下操作:
cat images.txt | sed '1d' | awk '{print "docker tag "$3" "$1":"$2}' | /bin/bash
如果您有带有 as 标签的图像,您需要先编辑 images.txt 以跳过这些,和/或手动完成它们。
我编写了一个单行脚本,导入一堆 .tar 文件并立即标记图像。
for image in $(ls); do docker tag "$(echo $(docker import $image))" $image ; done
请注意,当所有 tar 文件都找到后,您应该位于该文件夹内。