Dockerをクリーンアップ

Dockerをクリーンアップ

August 4, 2020
Misc
Docker

TL;DR #

以下コピペで実行。

for i in $(docker ps -a --format '{{ .ID }}'); do docker rm $i; done
for i in $(docker volume ls --format '{{ .Name }}'); do docker volume rm $i; done
for i in $(docker network ls --format '{{ .Name }}'); do docker network rm $i; done

ユースケース #

ローカルでDocker利用していて、ふと docker ps -a とか見るとゴミが大量に出てきてクリーンアップしたい!という話。

docker ps の CONTAINER ID だけ列挙したい #

--format を使う。

$ docker ps --help | grep format
      --format string   Pretty-print containers using a Go template

Go template で書式設定できると。 {{ .ID }} と書くと CONTAINER ID に置換されると。

$ docker ps -a --format '{{ .ID }}'
88f197add92a
c384983f2890
9f783fb9c5e2
ae67cca4faed
3f36ce6429a6
443fc5adc821

列挙した ID を for 文ループして削除 #

これで最初のスクリプトが出来上がる。

$ for i in $(docker ps -a --format '{{ .ID }}'); do docker rm $i; done

template で使える値 #

ドキュメントに書いてある。

https://docs.docker.com/engine/reference/commandline/ps/#formatting

覚え方としては docker ps で出てくるヘッダに対しては、

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

CONTAINER IDCREATED 以外は先頭だけ大文字のキャメルケース、 CONTAINER ID.IDCREATEDCreatedAt で suffix が付くといった感じ。

$ docker ps -a --format '{{.ID}},{{.Image}},{{.Command}},{{.CreatedAt}},{{.Status}},{{.Ports}},{{.Names}}'

volume と network もクリーンアップ #

それぞれ docker volume コマンドと docker network コマンドで値列挙と削除を行う。

for i in $(docker volume ls --format '{{ .Name }}'); do docker volume rm $i; done
for i in $(docker network ls --format '{{ .Name }}'); do docker network rm $i; done

終わりに #

他にもクリーンアップすべきリソースがあるかもだけど、 docker コマンド駆使すれば大丈夫でしょう。