Dockerで任意のイメージやコンテナをまとめて消す

# 任意のイメージやコンテナをまとめて消したい
Dockerfileを構築したりしてるとコンテナやイメージがどんどん増えていく．しかし，`prune`で全て消す訳にもいかない...

## `-f`(`--filter`), `--format`を使う
`docker ps`, `docker images`ではフィルタリングとフォーマッティングができる．

## フィルタリング`-f`
任意のキーでフィルタリングできる．`-f`は複数回使える．

```
$ docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED             
1395759a7d8d   foo                        "bash"                   8 seconds ago       
c5d49f37df0e   foo                        "bash"                   16 minutes ago    
0d772e3c9df1   bar                        "docker-entrypoint.s…"   About an hour ago   
bb43a3ad3354   bar                        "docker-entrypoint.s…"   About an hour ago        
d4116724f683   baz                        "forever --killTree …"   About an hour ago      

$ docker ps -a -f ancestor=foo
CONTAINER ID   IMAGE                      COMMAND                  CREATED             
1395759a7d8d   foo                        "bash"                   8 seconds ago       
c5d49f37df0e   foo                        "bash"                   16 minutes ago
```

### コンテナ

https://docs.docker.jp/engine/reference/commandline/ps.html#ps-filtering

> | キー | 説明 |
| -- | -- |
| id |（コンテナの ID）|
| label |（ label=<key> か label=<key>=<value> ）|
| name |（コンテナの名前）|
| exited |（整数値 - コンテナの終了コード。実用的なのは --all）|
| status |（created|restarting|running|paused|exited|dead）|
| ancestor |（ <イメージ名>[:<タグ>] 、 <イメージID> 、 <イメージ@digest> ） - 特定のイメージから作られた子コンテナを作成します。|
| before |（コンテナ ID か名前） - 指定した ID か名前よりも前に作成したコンテナでフィルタ|
| since |（コンテナ ID か名前） - 指定した ID か名前よりも後に作成したコンテナでフィルタ|
| isolation | （default|process|hyperv）（Windows デーモンのみ）|
| volume |（ボリューム名かマウントポイント） - コンテナがマウントしているボリュームでフィルタ|
| network |（ネットワーク ID か名前）- コンテナが接続しているネットワークでフィルタ|

### イメージ

https://docs.docker.jp/engine/reference/commandline/images.html#images-filtering

> | キー | 説明 |
| -- | -- |
| dangling |（ダングリング；宙ぶらりんな状態）なイメージ （ブール値： true か false ） |
| label |（ label=<key> か label=<key>=<value> ） |
| before | ( <イメージ名>[:<タグ>], <イメージ ID> または <image@digest> - 指定した ID もしくはリファレンスよりも前に作成したイメージでフィルタ |
| since | ( <イメージ名>[:<タグ>], <イメージ ID> または <image@digest> - 指定した ID もしくはリファレンスよりも後に作成したイメージでフィルタ |

- `dangling`はイメージのタグ付がされていない`<none>`をフィルタリングする．
- リポジトリ，タグでフィルタリングするにはそのままオプションとして入力する.

```
$ docker images
REPOSITORY                 TAG       IMAGE ID       CREATED             SIZE
foo                        latest    e4bab8119042   About an hour ago   5.09GB
<none>                     <none>    e4b2cac62ee8   About an hour ago   5.09GB
<none>                     <none>    cd34e378bf28   About an hour ago   5.09GB

$ docker images -f dnagling=true
REPOSITORY                 TAG       IMAGE ID       CREATED             SIZE
<none>                     <none>    e4b2cac62ee8   About an hour ago   5.09GB
<none>                     <none>    cd34e378bf28   About an hour ago   5.09GB

$ docker images foo
REPOSITORY                 TAG       IMAGE ID       CREATED             SIZE
foo                        latest    e4bab8119042   About an hour ago   5.09GB
```

## フォーマット`--format`

任意のプレースホルダで出力をフォーマッティングできる．

```
$ docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED             
1395759a7d8d   foo                        "bash"                   8 seconds ago       
c5d49f37df0e   foo                        "bash"                   16 minutes ago    
0d772e3c9df1   bar                        "docker-entrypoint.s…"   About an hour ago   
bb43a3ad3354   bar                        "docker-entrypoint.s…"   About an hour ago        
d4116724f683   baz                        "forever --killTree …"   About an hour ago      

$ docker ps -a --format {{.ID}}
1395759a7d8d
c5d49f37df0e
0d772e3c9df1
bb43a3ad3354
d4116724f683
```

### コンテナ

https://docs.docker.jp/engine/reference/commandline/ps.html#ps-formatting

> | プレースホルダ | 説明 |
| -- | -- |
| .ID| 	コンテナ ID |
| .Image| 	イメージ ID |
| .Command| 	クォートされたコマンド |
| .CreatedAt| 	コンテナが作成された時間 |
| .RunningFor| 	コンテナが起動してからの時間 |
| .Ports| 	公開しているポート |
| .Status| 	コンテナのステータス |
| .Size| 	コンテナのディスク容量 |
| .Names| 	コンテナ名 |
| .Labels| 	コンテナに割り当てられている全てのラベル |
| .Label| 	コンテナに割り当てられた特定のラベル。例： {{.Label "com.docker.swarm.cpu"}} |

### イメージ

https://docs.docker.jp/engine/reference/commandline/images.html#images-formatting

> | プレースホルダ | 説明 |
| -- | -- |
| .ID |	イメージ ID |
| .Repository |	リポジトリ |
| .Tag |	イメージのタグ |
| .Digest |	イメージのダイジェスト版 |
| .CreatedSince |	イメージを作成してからの経過時間 |
| .CreatedAt |	イメージの作成時間 |
| .Size |	イメージ・ディスクの容量 |

## Examples

### 同一イメージのコンテナをまとめて消す

```
$ docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED             
1395759a7d8d   foo                        "bash"                   8 seconds ago       
c5d49f37df0e   foo                        "bash"                   16 minutes ago    
0d772e3c9df1   bar                        "docker-entrypoint.s…"   About an hour ago   
bb43a3ad3354   bar                        "docker-entrypoint.s…"   About an hour ago        
d4116724f683   baz                        "forever --killTree …"   About an hour ago 

$ docker ps -a -f ancestor=foo --format {{.ID}}
1395759a7d8d
c5d49f37df0e

$ docker rm $(!!)
1395759a7d8d
c5d49f37df0e

$ docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED                
0d772e3c9df1   bar                        "docker-entrypoint.s…"   About an hour ago   
bb43a3ad3354   bar                        "docker-entrypoint.s…"   About an hour ago        
d4116724f683   baz                        "forever --killTree …"   About an hour ago 
```

- `!!`は直前のコマンド

### 特定のコンテナ以外のコンテナをまとめて消す

```
$ docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED             
1395759a7d8d   foo                        "bash"                   8 seconds ago       
c5d49f37df0e   foo                        "bash"                   16 minutes ago    
0d772e3c9df1   bar                        "docker-entrypoint.s…"   About an hour ago   
bb43a3ad3354   bar                        "docker-entrypoint.s…"   About an hour ago        
d4116724f683   baz                        "forever --killTree …"   About an hour ago 

$ docker ps -a --format {{.ID}} | grep -v -e bb4 -e b41
1395759a7d8d
c5d49f37df0e
0d772e3c9df1

$ docker rm $(!!)
1395759a7d8d
c5d49f37df0e
0d772e3c9df1

$ docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED             
bb43a3ad3354   bar                        "docker-entrypoint.s…"   About an hour ago        
d4116724f683   baz                        "forever --killTree …"   About an hour ago 
```

### タグ付けされていないイメージを全て消す

```
$ docker images
REPOSITORY                 TAG       IMAGE ID       CREATED             SIZE
foo                        latest    e4bab8119042   About an hour ago   5.09GB
<none>                     <none>    e4b2cac62ee8   About an hour ago   5.09GB
<none>                     <none>    cd34e378bf28   About an hour ago   5.09GB

$ docker images -f dnagling=true --format {{.ID}}
e4b2cac62ee8
cd34e378bf28

$ docker rmi -f $(!!)
Deleted: sha256:e4b2cac62ee8...
Deleted: sha256:cd34e378bf28...

$ docker images
REPOSITORY                 TAG       IMAGE ID       CREATED             SIZE
foo                        latest    e4bab8119042   About an hour ago   5.09GB
```