Docker如何更改存储库名称或重命名图像?

我正在尝试更改映像的存储库名称:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEserver              latest              d583c3ac45fd        26 minutes ago      685.5 MB

因此,我想将名称server更改为类似于myname/server的名称:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEmyname/server       latest              d583c3ac45fd        26 minutes ago      685.5 MB

我怎么能这么做?

584802 次浏览
docker image tag server:latest myname/server:latest

docker image tag d583c3ac45fd myname/server:latest

标签只是完整图像名称(d583c3ac45fd...)的人类可读别名。

因此,您可以随心所欲地将它们中的许多与同一图像相关联。如果您不喜欢旧名称,可以在重新标记后将其删除:

docker rmi server

这只会删除alias/tag。由于d583c3ac45fd有其他名称,因此实际图像不会被删除。

作为速记,您可以运行:

docker tag d58 myname/server:latest

其中d58表示IMAGE ID的前3个字符,在这种情况下,这就是您需要的全部。

最后,您可以删除旧图像,如下所示:

docker rmi server
docker tag CURRENT_IMAGE_NAME DESIRED_IMAGE_NAME

最近我不得不将一些图像从Docker注册表(docker.mycompany.com)迁移到ArtiFactory(docker.artifactory.mycompany.com)

docker pull docker.mycompany.com/something/redis:4.0.10docker tag docker.mycompany.com/something/redis:4.0.10 docker.artifactory.mycompany.com/something/redis:4.0.10docker push docker.artifactory.mycompany.com/something/redis:4.0.10

接受的答案非常适合单一重命名,但这里有一种方法可以一次重命名具有相同存储库的多个图像(并删除旧图像)。

如果您有表格的旧图像:

$ docker imagesREPOSITORY               TAG                 IMAGE ID            CREATED             SIZEold_name/image_name_1    latest              abcdefghijk1        5 minutes ago      1.00GBold_name/image_name_2    latest              abcdefghijk2        5 minutes ago      1.00GB

你想要:

new_name/image_name_1new_name/image_name_2

然后你可以使用这个(适当地在OLD_REPONAMENEW_REPONAMETAG中替换):

OLD_REPONAME='old_name'NEW_REPONAME='new_name'TAG='latest'
# extract image name, e.g. "old_name/image_name_1"for image in $(docker images | awk '{ if( FNR>1 ) { print $1 } }' | grep $OLD_REPONAME)do \OLD_NAME="${image}:${TAG}" && \NEW_NAME="${NEW_REPONAME}${image:${#OLD_REPONAME}:${#image}}:${TAG}" && \docker image tag $OLD_NAME $NEW_NAME && \docker rmi $image:${TAG}  # omit this line if you want to keep the old imagedone

要重命名图像,您需要给它一个新标签,然后使用'rmi'命令删除旧标签:

docker标签$docker rmi

#删除镜像#删除镜像#删除镜像

第二步很可怕,因为'rmi'的意思是“删除图像”。然而,如果Docker有任何其他标签,它实际上不会删除图像。也就是说,如果你立即使用: docker rmi,那么它实际上会删除图像(假设没有分配给图像的其他标签)

根据docker留档https://docs.docker.com/engine/reference/commandline/rename/

docker rename CONTAINER NEW_NAME
docker image tag #imageId myname/server:latest

这对我有用

由于Docker不提供镜像重命名功能,以下是如何通过三个命令有效重命名docker镜像:

docker pull UglyOldTagdocker tag  UglyOldTag ShinyNewTagdocker rmi  UglyOldTag

说明:这实际上只是添加一个新标签并删除旧标签。如上所述,标签实际上只是指向图像ID字段的助记符别名或指针。如果这还不够令人困惑,Docker API和留档还经常使用“标签”来引用版本(即图像名称中“:”之后的部分,如MyImage**:**最新)。

然而,错别字和错误的名称并不是您可能想要重命名标签的唯一地方。例如,如果您使用亚马逊的ECR,在您签入图像之前,您需要分配完整的ARN作为标签。这意味着您的标签又大又丑!

说明:当您查看下面的示例时,请记住Amazon和DockerHub将docker映像的每个层次结构称为“存储库”。

# Create the ECR 'repository' for the imageaws ecr create-repository \--repository-name myFavoriteTag \--image-scanning-configuration scanOnPush=true \--region myFavoriteRegiondocker tag myFavoriteTag:latest aws_account_id.dkr.ecr.aws_region.amazonaws.com/myFavoriteTag:latestdocker push aws_account_id.dkr.ecr.aws_region.amazonaws.com/myFavoriteTag:latest

所以,一个快速清理丑陋的方法是

ECR_BASE==aws_account_id.dkr.ecr.aws_region.amazonaws.comdocker pull ${ECR_BASE}/myFavoriteTagdocker tag  ${ECR_BASE}/myFavoriteTag myFavoriteTagdocker rmi  ${ECR_BASE}/myFavoriteTagdocker run myFavoriteTag

当然,要检查它回到ECR,你必须把丑陋的东西放回去

docker tag ${ECR_BASE}/myFavoriteTag:latest

下面的python代码重命名多个图像,然后推送回新的存储库。这是一个用python3.6编写的docker存储库迁移代码

import dockerclient = docker.from_env()docker_api = docker.APIClient()images = client.images.list()for image in images:try:if image.tags[0] and '<old repository>' in image.tags[0]:version = image.tags[0].split("/")[-1]type(version)print("version is {}".format(version))docker_api.tag(image.tags[0],"<new repository>/{}".format(version))except Exception as Ex:print(image)print(Ex)

然后通过下面的外壳脚本推送图片

docker images | grep <new repository> | awk '{print $1":"$2}' | xargs -L1 docker push

您可以使用此命令更改多个repos/tag标签:

docker images --filter=reference='server' --format='\{\{.Repository}}:\{\{.Tag}}' | xargs -r -P$(nproc) -I {} docker image tag {} myname/{}

如何重命名图像?

要复制图像或重命名现有图像,您只需要从现有图像创建一个新的标记或存储库。您可以使用docker标签命令执行此操作。


syntax/command:  docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

#=> docker imagesREPOSITORY                    TAG                   IMAGE ID       CREATED        SIZEubuntu-git                    latest                c0aaaba33a60   18 hours ago   208MB

docker tag ubuntu-git:latest ubuntu-git:latest-new-tag

#=> docker imagesREPOSITORY                    TAG                   IMAGE ID       CREATED        SIZEubuntu-git                    latest                c0aaaba33a60   18 hours ago   208MBubuntu-git                    latest-new-tag        c0aaaba33a60   18 hours ago   208MB

使用图像ID重命名

docker image tag <TAG> <NAME YOU WANT TO GIVE>

截至2022年,没有一个顶级答案真正明确地说明了如何轻松地“重命名”给定存储库的标签,以便将一个存储库的标签迁移到另一个存储库。BenSuperpc的回答让我找到了这个oneliner,它帮助我将我的GitLab注册表移动到Quay。

首先,如果需要,您可以一次提取所有图像:

docker pull oldregistry.example.com/my-image --all-tags

oneliner:

docker image list oldregistry.example.com/my-image --format "\{\{.Tag}}" | xargs -r -P$(nproc) -I {} docker image tag oldregistry.example.com/my-image:{} newregistry.example.com/my-image:{}

最后:

docker push newregistry.example.com/my-image --all-tags

如果需要,不要忘记在拉/推命令之前使用docker login