Docker如何更改仓库名称或重命名镜像?

898

我正在尝试更改图像的仓库名称:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
server              latest              d583c3ac45fd        26 minutes ago      685.5 MB
因此我想将名称server更改为类似myname/server的东西:

因此我希望将名称server更改为类似于myname/server的内容:

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

我该怎么做?

14个回答

1577
docker image tag server:latest myname/server:latest
或者
docker image tag d583c3ac45fd myname/server:latest

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

因此,您可以将任意数量的标签与同一镜像关联。如果您不喜欢旧名称,可以在重新标记后将其删除:

docker rmi server

这只会删除别名/标签,因为d583c3ac45fd有其他名称,实际图像不会被删除。


就像@matanster所说的那样,这对于一个Docker新手来说是非常令人困惑的。我认为,由于Docker仓库只能有一个镜像,因此镜像名称直接指向仓库。 - Hans

50

你可以使用一种简洁的方式来运行:

docker tag d58 myname/server:latest

其中d58代表图像ID的前3个字符,在这种情况下,您只需要这些。

最后,您可以按以下方式删除旧图像:

docker rmi server

32

最近我需要将一些图像从Docker仓库(docker.mycompany.com)迁移到Artifactory(docker.artifactory.mycompany.com)。

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

24
docker tag CURRENT_IMAGE_NAME DESIRED_IMAGE_NAME

16

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

docker pull UglyOldTag
docker tag  UglyOldTag ShinyNewTag
docker rmi  UglyOldTag

注意:这其实只是添加一个新标签并删除旧标签。如上所述,标签实际上只是一个助记别名或指向图像ID字段的指针。如果这还不够混乱,Docker API和文档也经常使用“标签”来指代版本(即在镜像名称中紧跟着“:”的部分,比如MyImage**:**latest)。

然而,拼写错误和错误名称不是你可能想要重命名标签的唯一场所。例如,如果你正在使用Amazon的ECR,在你可以检查图像之前,需要将完整的ARN分配为标签。这意味着你的标签又大又丑!

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

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

因此,快速清除丑陋的方法是

ECR_BASE==aws_account_id.dkr.ecr.aws_region.amazonaws.com
docker pull ${ECR_BASE}/myFavoriteTag
docker tag  ${ECR_BASE}/myFavoriteTag myFavoriteTag
docker rmi  ${ECR_BASE}/myFavoriteTag
docker run myFavoriteTag
当然,要将其检查回ECR,您必须将丑陋的东西放回去。
docker tag ${ECR_BASE}/myFavoriteTag:latest

9

简单易懂

使用 IMAGE ID 更改镜像名称(或仓库名称):

docker tag <IMAGE ID> <想要命名的名称>


4
如何重命名图片?
想要复制一个镜像或是重命名存在的镜像,只需从已有的标签或仓库创建一个新的即可。您可以使用 docker tag 命令来实现这一点。
syntax/command:  docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

#=> docker images
REPOSITORY                    TAG                   IMAGE ID       CREATED        SIZE
ubuntu-git                    latest                c0aaaba33a60   18 hours ago   208MB

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

#=> docker images
REPOSITORY                    TAG                   IMAGE ID       CREATED        SIZE
ubuntu-git                    latest                c0aaaba33a60   18 hours ago   208MB
ubuntu-git                    latest-new-tag        c0aaaba33a60   18 hours ago   208MB 

4
docker image tag #imageId myname/server:latest

这个对我有效


3

截至2022年,顶级答案中没有一个明确说明如何轻松“重命名”给定存储库的每个标签,以便将一个存储库的标签迁移到另一个存储库。Bensuperpc的回答引导我找到了这个一行代码,帮助我将GitLab注册表移动到Quay。

首先,如果需要,您可以使用以下命令一次性拉取所有图像:

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

一句话概括:

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:{}

Finally:

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

如果需要,在执行pull/push命令之前不要忘记使用docker login


2
被接受的答案适用于单个重命名,但是这里有一种方法可以一次性重命名具有相同存储库的多个图像(并删除旧图像)。
如果您有以下形式的旧图像:
$ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
old_name/image_name_1    latest              abcdefghijk1        5 minutes ago      1.00GB
old_name/image_name_2    latest              abcdefghijk2        5 minutes ago      1.00GB

你想要:

new_name/image_name_1
new_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 image
done


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接