我正在尝试更改图像的存储库名称:
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
我该怎么做?
下面的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
对于单个重命名来说,公认的答案很好,但这里有一种方法可以同时重命名具有相同存储库的多个图像(并删除旧图像)。
如果您有表单的旧图像:
$ 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
下面的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
截至2022年,没有一个顶级答案真正明确地说明了某人如何能够轻松地“重命名”给定存储库的每个标签,以便将一个存储库的标签迁移到另一个存储。Bensuprac的回答让我找到了这个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
如果需要,不要忘记在pull/push命令之前使用docker登录。