簡體   English   中英

Docker 如何更改存儲庫名稱或重命名映像?

[英]Docker how to change repository name or rename image?

我正在嘗試更改圖像的存儲庫名稱:

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

我怎樣才能做到這一點?

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 注冊表(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
docker tag CURRENT_IMAGE_NAME DESIRED_IMAGE_NAME

由於 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

接受的答案非常適合單次重命名,但這里有一種方法可以一次重命名具有相同存儲庫的多個圖像(並刪除舊圖像)。

如果您有表單的舊圖像:

$ 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_REPONAMETAGOLD_REPONAME ):

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 標記命令來做到這一點。


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 

下面的 python 代碼重命名多個圖像,然后推回到新的存儲庫。 這是一個用python3.6編寫的docker倉庫遷移代碼

client = docker.from_env()
docker_api = docker.APIClient()
images = client.images.list()
for image in images:
    try:
        if image.tags[0] and '<image you want to rename>' 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)

and then push images by below shell script

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

要重命名圖像,請給它一個新標簽,然后使用 'rmi' 命令刪除舊標簽:

$ 碼頭工人標簽 $ 碼頭工人 rmi

第二步是可怕的,因為“rmi”的意思是“刪除圖像”。 但是,如果有任何其他標簽,docker 實際上不會刪除圖像。 也就是說,如果您立即使用以下命令執行此操作: docker rmi ,那么它實際上會刪除圖像(假設沒有為圖像分配其他標簽)

docker image tag #imageId myname/server:latest

這對我有用

您可以使用以下命令更改多個 repos/tag 標簽:

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

使用圖像 ID 重命名

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

截至 2022 年,沒有一個最重要的答案真正明確說明人們如何輕松“重命名”給定存儲庫的每個標簽,以便將一個存儲庫的標簽遷移到另一個存儲庫。 Bensuperpc 的回答讓我找到了這個 oneliner,它幫助我將 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:{}

最后:

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

如有必要,不要忘記在拉/推命令之前使用docker login

根據 docker 文檔https://docs.docker.com/engine/reference/commandline/rename/

docker rename CONTAINER NEW_NAME

我正在嘗試更改圖像的存儲庫名稱:

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

我怎樣才能做到這一點?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM