docker_shell

docker相关的shell

镜像保存

但是,下面方式创建的镜像,为啥不可用呢?难道是不应该import?

# 保存镜像
for image in $(docker image ls |grep -v 10.131 |awk '{print $1,$2}' | sed '1d;s/\s/\:/g;')  ;do
    file=$(echo $image|sed 's#/#__#g')
    file=$file.tar
    echo "Save image: $image > $file"
    docker save -o "$file" "$image"
done

# 传输镜像
scp -r image/ root@10.20.26.93:/root/image

# 恢复镜像
for file in $(ls *.tar)  ;do
    image=$(echo $file|sed 's#__#/#g;s/.tar//g;')
    echo "Load image: $image < $file"
    cat $file |sudo docker import - $image
done

重命名

for image in $(docker image ls |grep -v 10.131 |awk '{print $1,$2}' | sed '1d;s/\s/\:/g');do
    new=$(echo $image|sed 's/.tar//g')
    echo "rename $image  >   $new"
    docker tag $image $new
done

删除镜像

docker image ls |grep .tar|awk '{print $3}' |sed 's/^/docker rmi /'


docker image ls |grep .tar|awk '{print $1,$2}'|sed 's/\s/\:/g;s/^/docker rmi /'

一般循环

for循环时,默认好像是用空格来分隔的,所以呢,先去掉原有的空格,转换成__,再处理。

for line in $(docker image ls |grep examples-bookinfo|awk '{print $1,$2,$3}' |sed 's/\s/__/g');do
    image=$(echo $line|awk -F '__' '{print $1}')
    tag=$(echo $line|awk -F '__' '{print $2}')
    imageid=$(echo $line|awk -F '__' '{print $3}')
    imagenew=$(echo $image|sed 's/10.131.9.12:5000/docker.io/g')
    docker tag "$image:$tag" "$imagenew:$tag"
done

优化 print,可以少个sed命令

docker image ls |grep examples-bookinfo|awk '{print $1"__"$2"__"$3}' 

awk '{print $1$2}' # 估计应该不会输出空格

根据列表拉取镜像

cat > bookinfo_image.txt <<EOL
istio/examples-bookinfo-reviews-v3:1.16.2
istio/examples-bookinfo-reviews-v2:1.16.2
istio/examples-bookinfo-reviews-v1:1.16.2
istio/examples-bookinfo-ratings-v1:1.16.2
istio/examples-bookinfo-details-v1:1.16.2
istio/examples-bookinfo-productpage-v1:1.16.2
EOL

for image in $(cat bookinfo_image.txt);do
    docker pull 10.131.9.12:5000/$image
    docker tag 10.131.9.12:5000/$image $image;
done