docker save -o
1つのコマンドでdocker-compose.yamlファイルのすべての画像に対して操作を実行しようとしています。
私ができたことは次のとおりです。
cat docker-compose.yaml | grep image
これにより、以下が提供されます。
image: hub.myproject.com/dev/frontend:prod_v_1_2
image: hub.myproject.com/dev/backend:prod_v_1_2
image: hub.myproject.com/dev/abd:v_2_3
image: hub.myproject.com/dev/xyz:v_4_6
各イメージに対して次のコマンドを実行する必要があります。
docker save -o frontend_prod_v_1_2.tar hub.myproject.com/dev/frontend:prod_v_1_2
私が達成したことは次のとおりです。
cat docker-compose.yml | grep image | cut -d ':' -f 2,3
これは作る:
hub.myproject.com/dev/frontend:prod_v_1_2
hub.myproject.com/dev/backend:prod_v_1_2
hub.myproject.com/dev/abd:v_2_3
hub.myproject.com/dev/xyz:v_4_6
私もできます:
cat docker-compose.yml | grep image | cut -d ':' -f 2,3 | cut -d '/' -f3 | cut -d ':' -f1,2
これは作る:
frontend:prod_v_1_2
backend:prod_v_1_2
abd:v_2_3
xyz:v_4_6
それから私は何をすべきかわかりません。私はtoを使って変数に渡そうとしましたが、xargs
コマンドラインでfrontend:prod_v_1_2
xargsを動的に変更する方法がわかりません。frontend_prod_v_1_2.tar
また、最後には完全なイメージ名とタグが必要です。
私は似たようなものを探しています:
cat docker-compose.yml | grep image | cut -d ':' -f 2,3 | xargs -I {} docker save -o ``{} | cut -d '/' -f3 | cut -d ':' -f1,2 | xargs -I {} {}.tar`` {}
bashの魔術師はヒントを提供できますか?
答え1
より多くのコマンドを追加すると、パイプライン方法が複雑になる可能性があります。この場合、bash
対応する操作を実行するには、基本シェルの機能を使用します。出力をgrep image docker-compose.yml
ループにパイプwhile..read
し、それを使用して交換を実行します。
正しいシェルスクリプトでは、次のことができます。
#!/usr/bin/env bash
# '<(..)' is a bash construct i.e process substitution to run the command and make
# its output appear as if it were from a file
# https://mywiki.wooledge.org/ProcessSubstitution
while IFS=: read -r _ image; do
# Strip off the part up the last '/'
iname="${image##*/}"
# Remove ':' from the image name and append '.tar' to the string and
# replace spaces in the image name
docker save -o "${iname//:/_}.tar" "${image// }"
done < <(grep image docker-compose.yml)
コマンドラインで、次のコマンドを使用してdocker saveジョブを直接実行しますxargs
。awk
awk '/image/ {
n = split($NF, arr, "/");
iname = arr[n]".tar";
sub(":", "_", iname); fname = $2;
cmd = "docker save -o " iname " " fname;
system(cmd);
}' docker-compose.yml