批量处理docker镜像
文章目录
这几天的工作频繁地操作大量docker镜像,这里总结一些过程中的小技巧。
小技巧
列出registry中的镜像
官方的docker registry虽然提供了一系列操作镜像的Restful API,但查看镜像列表并不直观,于是可以使用以下脚本查看registry中的镜像列表:
DOCKER_REGISTRY_ADDR=127.0.0.1:5000
for img in `curl -s ${DOCKER_REGISTRY_ADDR}/v2/_catalog | python -m json.tool | jq ".repositories[]" | tr -d '"'`; do
for tag in `curl -s 10.10.30.21:5000/v2/${img}/tags/list|jq ".tags[]" | tr -d '"'`; do
echo $img:$tag
done
done
删除registry中的某个镜像
docker registry上的镜像默认是不允许删除的,如要删除,需要在启动docker registry时指定环境变量REGISTRY_STORAGE_DELETE_ENABLED=true
,然后可以利用以下脚本删除镜像:
DOCKER_REGISTRY_ADDR=127.0.0.1:5000
function delete_image {
imgFullName=$1
img=`echo $imgFullName | awk -F ':' '{print $1}'`
tag=`echo $imgFullName | awk -F ':' '{print $2}'`
# delete image's blobs
for digest in `curl -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' -s ${DOCKER_REGISTRY_ADDR}/v2/${img}/manifests/${tag} | jq ".layers[].digest" | tr -d '"'`; do
curl -X DELETE ${DOCKER_REGISTRY_ADDR}/v2/${img}/blobs/${digest}
done
# delete image's manifest
imgDigest=`curl -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' -s ${DOCKER_REGISTRY_ADDR}/v2/${img}/manifests/${tag} | jq ".config.digest" | tr -d '"'`
curl -X DELETE ${DOCKER_REGISTRY_ADDR}/v2/${img}//manifests/${imgDigest}
}
修改镜像的名字
一般手工用docker tag
命令改镜像名字,一两个镜像这么做还行,如要批量操作,还是需要用脚本:
pulledImageName=127.0.0.1:5000/test/testdb/db:v1.0.0
# 只取不包含127.0.0.1:5000的镜像名
shortImageName=${pulledImageName#*/}
# 将repository的前缀修改为test2
changedShortImageName=${shortImageName/#test/test2}
# 将tag修改为1.0.0
changed2ShortImageName=${changedShortImageName/%v1.0.0/1.0.0}
docker tag $pulledImageName $changed2ShortImageName
列出kubernetes中目前使用到的镜像
有时需要列出Kubernetes中目前使用到的所有镜像,可以用以下脚本:
for img in `kubectl get pod -o yaml --all-namespaces | grep 'image:' | cut -c14- | sort | uniq`; do
echo $img
# save image to tar file
save_dir=${img%/*}
mkdir -p $save_dir
docker save -o ${img}.tar ${img}
done
建个远程隧道
在家工作,需要建个隧道连到远程服务器上去,可使用以下命令:
# Make PubkeyAuthentication enabled
ssh-copy-id root@${remote_ip}
# make tunnel with autossh
autossh -f -M 34567 -ND 7070 root@${remote_ip}
# use web browser with Socks 5 Proxy Server 127.0.0.1:7070
参考
文章作者 Jeremy Xu
上次更新 2019-05-19
许可协议 © Copyright 2020 Jeremy Xu