docker volumeの名前がハッシュ値のものを一括削除する

普段開発環境はdockerを使っています。dockerを使って開発していくとvolume名が64桁のハッシュ値のものがどんどん増えていきディスクを圧迫していきます。ディスクの容量がいっぱいになると、dockerの起動がしなくなったりして開発に支障が出たことがありました。それからはこまめに削除していますが、volume名がハッシュ値のものを一括で削除するスために下記スクリプトで削除しています。

$ docker volume ls | awk 'length($2)==64 {print $2}' | xargs docker volume rm

下記にそれぞれのコマンドの内容を簡単に記載しておきます。

docker volume ls

docker volume lsにより全てのvolumeを表示する。
1列目はdriverが表示され、2列目がvolume nameが表示される。

$ docker volume ls
DRIVER              VOLUME NAME
local               0b54333e1df6786dec2c213dae87d10ccc75a85ceade2498cc6abbed140c5ab9
local               2f87d4b910d4dae508c04edb7d004a7aecc1eddc7dc0e60d92d29306f7346279
local               3ee8993cda4164ab5e764ea7a097bd67cb0e4bc3b3702073a957c58c4c64dc59
local               pgsql-data

awk

awkコマンドにより上記のdocker volume lsで出力された結果を加工する。
awkコマンドは空白やカンマなどで区切られたテキストを処理できるコマンドである。文字列を検索したり、文字列を抜き出したりすることが可能である。
今回の場合、文字列を検索しているはlength($2)==64の箇所である。これは2列目の文字の長さが64文字のものを検索している。
そして{print $2}で2列目を抜き出している

$ docker volume ls | awk 'length($2)==64'
DRIVER              VOLUME NAME
local               0b54333e1df6786dec2c213dae87d10ccc75a85ceade2498cc6abbed140c5ab9
local               2f87d4b910d4dae508c04edb7d004a7aecc1eddc7dc0e60d92d29306f7346279
local               3ee8993cda4164ab5e764ea7a097bd67cb0e4bc3b3702073a957c58c4c64dc59

$ docker volume ls | awk '{print $2}'
0b54333e1df6786dec2c213dae87d10ccc75a85ceade2498cc6abbed140c5ab9
2f87d4b910d4dae508c04edb7d004a7aecc1eddc7dc0e60d92d29306f7346279
3ee8993cda4164ab5e764ea7a097bd67cb0e4bc3b3702073a957c58c4c64dc59
pgsql-data

$ docker volume ls | awk 'length($2)==64 {print $2}'
0b54333e1df6786dec2c213dae87d10ccc75a85ceade2498cc6abbed140c5ab9
2f87d4b910d4dae508c04edb7d004a7aecc1eddc7dc0e60d92d29306f7346279
3ee8993cda4164ab5e764ea7a097bd67cb0e4bc3b3702073a957c58c4c64dc59

xargs

標準入力からコマンドラインを構築して実行することができる。例えばcommandA | xargs commandBcoomandAで実行した結果をcommandBの引数としてcommandBを実行する。
今回のスクリプトでは| xargs docker volume rmとしているのでawkコマンドで得られた64桁のvolume名をdocker volume rmに引数として渡している。docker volume rm volume名volume名のvolumeを削除する。