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

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

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

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

我该怎么做?


当前回答

对于单个重命名来说,公认的答案很好,但这里有一种方法可以同时重命名具有相同存储库的多个图像(并删除旧图像)。

如果您有表单的旧图像:

$ 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_REPONAME、NEW_REPONAME和TAG中进行子标记,视情况而定):

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

其他回答

作为速记,您可以运行:

docker tag d58 myname/server:latest

其中d58表示IMAGE ID的前3个字符,在本例中,这就是您所需要的。

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

docker rmi server

要重命名图像,请给它一个新标记,然后使用“rmi”命令删除旧标记:

$docker标签$docker rmi美元

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

对于单个重命名来说,公认的答案很好,但这里有一种方法可以同时重命名具有相同存储库的多个图像(并删除旧图像)。

如果您有表单的旧图像:

$ 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_REPONAME、NEW_REPONAME和TAG中进行子标记,视情况而定):

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

易于理解的

使用图像ID更改图像名称(或存储库名称):

docker标签<图像ID><你想给的名字>

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

import docker
client = 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)

然后通过下面的shell脚本推送图像

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