【问题标题】:Docker how to change repository name or rename image?Docker如何更改存储库名称或重命名图像?
【发布时间】:2014-10-02 09:18:38
【问题描述】:

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

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

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

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

我该怎么做?

【问题讨论】:

  • REPOSITORY和TAG有什么区别?
  • @CharlieParker TAG 通常用于存储库的版本——例如,标签为 10.1 的存储库 mariadb
  • 遵循以下 docker tag --help cmd 的语法:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • 我想更改 dockerhub 中的整个存储库名称.. 太糟糕了,这是不可能的 :(

标签: docker linux-containers


【解决方案1】:
docker image tag server:latest myname/server:latest

docker image tag d583c3ac45fd myname/server:latest

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

因此,您可以根据需要将任意数量的图片与同一张图片相关联。如果您不喜欢旧名称,可以在重新标记后将其删除:

docker rmi server

这只会删除alias/tag。由于d583c3ac45fd有其他名称,所以不会删除实际图片。

【讨论】:

  • 这对我不起作用。当我运行 docker tag myname/server:latest docker 认为适合在 docker.io 之前添加,所以图像标签最终是 docker.io/myname/server:latest。
  • 您的主机操作系统和 Docker 版本是什么?我怀疑有关您的 Docker 安装的某些内容正在修改标记指令。
  • 我还发现,如果图像名称只有一个标签,则省略 :latest 也可以。但是在docker images 的输出中,图像名称被称为REPOSITORY(而不是图像)是非常特殊的,而它需要使用名为tag 的命令重命名,而TAG 是一个单独的列那个输出。我希望他们清理这个和其他相关的东西......
  • 请注意,您可能需要docker image tag from_server:version to_server:version,如下所述:docs.docker.com/engine/reference/commandline/image_tag
  • 当我做docker tag foo/hello:v1 foo/hello:latest 然后在我的下一步做docker push foo/hello。这推动了最新的上游武装。现在,如果我需要推送另一个增量版本,但希望 docker 用最新版本(比如 v2)更新最新标签。这可以自动完成吗?
【解决方案2】:

作为简写你可以运行:

docker tag d58 myname/server:latest

d58 代表 IMAGE ID 的前 3 个字符,在这种情况下,这就是您所需要的。

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

docker rmi server

【讨论】:

  • 在我的情况下,使用完整 ID 以某种方式将 :latest 附加到它的末尾并给出一个错误,声称它找不到它。前 3 个字母效果更好。 (即docker tag d583c3ac45fd myname/server:latest 不起作用,而docker tag d58 myname/server:latest 起作用。)
  • 有时也发生在我身上,例如提供完整的图像 ID 不起作用,但提供一些初始值。有谁知道这背后的原因吗?
【解决方案3】:

最近我不得不将一些镜像从 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

【讨论】:

    【解决方案4】:
    docker tag CURRENT_IMAGE_NAME DESIRED_IMAGE_NAME
    

    【讨论】:

    • 当然,这会起作用,但你还没有向这个人解释原因。他们似乎对 Docker 标签是什么感到困惑……假设他们确实知道如何使用 docker -h
    • @AdamKaplan 是的,你是对的,正如安迪的回答所解释的那样,它不是重命名或更改名称,而是 添加 新标签到同一图像。
    【解决方案5】:

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

    docker pull UglyOldTag
    docker tag  UglyOldTag ShinyNewTag
    docker rmi  UglyOldTag
    

    注意:这实际上只是添加一个新标签并删除旧标签。如上所述,标签实际上只是一个 助记别名,或者是一个指向图像 ID 字段的指针。如果这还不够令人困惑,Docker API 和文档也经常使用“tag”来指代 version(即图像名称中的":",如 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
    

    【讨论】:

    • 如果有人假设使用名称中的拼写错误标记图像,复制相同的拼写错误并将其推送到他们的 Sonatype Nexus 存储库,会发生什么情况?可以正确重新标记远程图像吗?求朋友。
    【解决方案6】:

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

    如果您有表格的旧图像:

    $ 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
    
    

    【讨论】:

      【解决方案7】:
      docker image tag #imageId myname/server:latest
      

      这对我有用

      【讨论】:

        【解决方案8】:

        下面的 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
        

        【讨论】:

          【解决方案9】:

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

          $ 泊坞窗标签 $ docker rmi

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

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              【解决方案11】:

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

              docker rename CONTAINER NEW_NAME
              

              【讨论】:

              • 您可以使用此命令重命名容器,而不是图像。
              猜你喜欢
              • 2011-08-17
              • 1970-01-01
              • 2011-05-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-05
              • 1970-01-01
              相关资源
              最近更新 更多