docker psの表示を絞りたい

# なにこれ
- `docker ps`の結果のうち、一部だけを表示するメモ
- まとめ：書ききれないので[Official Documentation](https://docs.docker.com/engine/reference/commandline/ps/)を読もう。特に[フィルタリング](https://docs.docker.com/engine/reference/commandline/ps/#filtering)。

# 準備

```bash:ヘルプ表示
$ docker ps -h
Flag shorthand -h has been deprecated, please use --help

Usage:  docker ps [OPTIONS]

List containers

Options:
  -a, --all             Show all containers (default shows just running)
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print containers using a Go template
  -n, --last int        Show n last created containers (includes all states) (default -1)
  -l, --latest          Show the latest created container (includes all states)
      --no-trunc        Don't truncate output
  -q, --quiet           Only display container IDs
  -s, --size            Display total file sizes
```

```bash:hello-worldコンテナを５つ作成
$ for i in `seq 1 5`; do  docker run hello-world; done
$ docker ps -a -n 5
CONTAINER ID   IMAGE         COMMAND    CREATED              STATUS                          PORTS     NAMES
bcca4b50f397   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             cool_hertz
e6d3616b5a67   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             clever_chatelet
bd7678b95d36   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             zealous_maxwell
e68109080f0b   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             agitated_fermi
d59d057989ce   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             vigilant_kilby
```

# Runningのコンテナだけ表示する

```bash:全部Exitedなので表示されない
$ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS                      PORTS     NAMES
```

# CONTAINER IDで絞る

```bash:idが236858d287f8であるものを表示
$ docker ps -a -f id=bcca4b50f397
CONTAINER ID   IMAGE         COMMAND    CREATED              STATUS                          PORTS     NAMES
bcca4b50f397   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             cool_hertz
```

# NAMEで絞る

```bash:NAMEがcool_hertzであるものを表示
$ docker ps -a -f name=cool_hertz
CONTAINER ID   IMAGE         COMMAND    CREATED              STATUS                          PORTS     NAMES
bcca4b50f397   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             cool_hertz
```

```bash:NAMEがcで始まるものを表示
$ docker ps -a -f name=^c.*
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
bcca4b50f397   hello-world   "/hello"   2 minutes ago   Exited (0) 2 minutes ago             cool_hertz
e6d3616b5a67   hello-world   "/hello"   2 minutes ago   Exited (0) 2 minutes ago             clever_chatelet
```

# CONTAINER IDだけ出力する

```bash:NAMEがcで始まるもののCONTAINER_IDを出力
$ docker ps -a -f name=^c.* -q
bcca4b50f397
e6d3616b5a67
```

# IMAGEだけ出力する

- formatのPlaceHolderについて記事末尾を参照。

```bash:NAMEがcで始まるもののIMAGEを出力
$ docker ps -a -f name=^c.* --format '{{.Image}}'
hello-world
hello-world
```

# カラムを限定する

- formatのPlaceHolderについて記事末尾を参照。

```bash:CONTAINER_IDとNAMESとPORTSカラムのみ表示
$ docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"
CONTAINER ID   NAMES                  PORTS
bcca4b50f397   cool_hertz             
e6d3616b5a67   clever_chatelet        
bd7678b95d36   zealous_maxwell        
e68109080f0b   agitated_fermi         
d59d057989ce   vigilant_kilby  
```

# 〇〇より前・後に作られたコンテナ
```bash:NAME=zealous_maxwellよりまえ
$ docker ps -a -f before=zealous_maxwell
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
e68109080f0b   hello-world   "/hello"   4 minutes ago   Exited (0) 4 minutes ago             agitated_fermi
d59d057989ce   hello-world   "/hello"   4 minutes ago   Exited (0) 4 minutes ago             vigilant_kilby

```

```bash:NAME=zealous_maxwellよりあと
$ docker ps -a -f since=zealous_maxwell 
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
bcca4b50f397   hello-world   "/hello"   5 minutes ago   Exited (0) 5 minutes ago             cool_hertz
e6d3616b5a67   hello-world   "/hello"   5 minutes ago   Exited (0) 5 minutes ago             clever_chatelet
```

# 最後からn番目まで
```bash:最後に作られたコンテナ
docker ps -l
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
bcca4b50f397   hello-world   "/hello"   5 minutes ago   Exited (0) 5 minutes ago             cool_hertz
```

```bash:最後から3番目まで
$ docker ps -a -n 3
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
bcca4b50f397   hello-world   "/hello"   5 minutes ago   Exited (0) 5 minutes ago             cool_hertz
e6d3616b5a67   hello-world   "/hello"   5 minutes ago   Exited (0) 5 minutes ago             clever_chatelet
bd7678b95d36   hello-world   "/hello"   5 minutes ago   Exited (0) 5 minutes ago             zealous_maxwell
```

# ラベルで絞る

- 参照：[クエリ・ラベル](http://docs.docker.jp/v1.12/engine/userguide/labels-custom-metadata.html#id5)

```bash:com.example.is-betaがのラベルが存在するものすべて
$ docker ps --filter "label=com.example.is-beta"
```

```bash:colorラベルの値がblueのもの
$ docker ps --filter "label=color=blue"
```

# PlaceHolderについて
| Placeholder | （だいたい対応する）カラム名 |             Description                                                                      | 
| ----------- | -----------------------|---------------------------------------------------------------------- | 
| .ID         | CONTAINER ID     |   コンテナID                                                                           | 
| .Image      | IMAGE                   | イメージID                                                                   | 
| .Command    | COMMAND|コマンド                                                                                | 
| .CreatedAt  | CREATED|コンテナの作成日時                                                          | 
| .RunningFor | CREATEDから計算| コンテナの開始からの時間                                                 | 
| .Ports      | PORTS|開放するポート                                                                                | 
| .State      | STATUS|コンテナのステータス (例えば; “created”, “running”, “exited”).                         | 
| .Status     | STATUS|コンテナのステータス（詳細付き）                               | 
| .Size       | SIZE|コンテナのサイズ                                                                          | 
| .Names      | NAMES|コンテナ名                                                                              | 
| .Labels     | - |コンテナについたすべてのラベル                                                         | 
| .Label      | - |コンテナについた特定のラベル。 例えば '{{.Label "com.docker.swarm.cpu"}}' | 
| .Mounts     | - |マウントされたボリューム                                               | 
| .Networks   | - |アタッチされたネットワーク                                             | 

# ついでに

### 絞った結果のコンテナをすべて削除する

```bash:直近3個のコンテナを削除する
# とりあえずxargsでdocker rmにCONTAINER IDをすべて渡せば消せる
$ docker ps -a -n 3 -q | xargs docker rm
```

### サイズで絞るのは面倒

```bash:失敗例
# 一番左にsizeカラムが来るようにしたうえで、sortコマンドに処理させたらいいかと思ったが、
# 単位が邪魔だし、size/virtual sizeかも邪魔で区別できないので失敗する
$ docker ps -a -n 3 --format "table {{.Size}}\t{{.ID}}\t{{.Names}}\t{{.Ports}}" | (read -r; printf "%s\n"; sort -k 1)
```