[英]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_REPONAME
、 NEW_REPONAME
和TAG
中OLD_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.