Docker のイメージ／コンテナ／ボリュームがすでに存在しているか確認する

> Dockerfile でイメージをビルドする前に、<font color=darkorange>**すでに Docker イメージが作成されているかシェル（特に `bash`）で確認**</font>したい。つまり、ビルド前の事前確認をしたいのです。

[「`docker` `イメージ` `存在` `確認`」で Qiita 記事に絞ってググって](https://www.google.com/search?q=site:qiita.com+docker+%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8+%E5%AD%98%E5%9C%A8+%E7%A2%BA%E8%AA%8D)も、ドンピシャでヒットしなかったので、未来の自分のググラビリティとして。

<details><summary>検証環境：Docker <strong>v18</strong>.09.0, <strong>macOS</strong> High Sierra</summary>
<div>

```shell-session:検証環境
$ date
2019年 1月 4日 金曜日 01時34分05秒 JST
$ 
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G4015
$ 
$ docker version
Client: Docker Engine - Community
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:47:43 2018
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:55:00 2018
  OS/Arch:          linux/amd64
  Experimental:     false
``` 
</div></details>

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. `docker` の `image` もしくは `container` コマンドに `-q` もしくは `--quiet` オプションで ID のみを表示させて確認できます
2. `-q` オプションを付けると、イメージが存在する場合は値（ID）のみが戻って来ます
    ```
    -q, --quiet           Only show image IDs
    ````
3. その戻り値の「ある・なし」で `if` 分岐して `prune` するなり、`rm` で削除するなりできます。そのため `bash` に限らず他のシェルでも確認できます。詳しくは TS; DR 参照

以下は、既存のイメージ／コンテナ／ボリューム確認の基本構文です。

```bash:基本構文（イメージ）
docker image ls -q $NAME_IMAGE
docker image ls -q $NAME_IMAGE:$TAG
```

```bash:基本構文（コンテナ）
# 起動中コンテナ
docker container ls -q -f name="$NAME_CONTAINER"
# 停止中も含めたコンテナ
docker container ls -q -f -a name="$NAME_CONTAINER"
```

```bash:基本構文（ボリューム）
docker volume ls -q -f name="$NAME_VOLUME"
```

```shell-session:イメージの場合の例
$ # 既存イメージの確認
$ docker image ls
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
busybox                 latest              3a093384ac30        2 days ago          1.2MB
alpine                  latest              3f53bb00af94        13 days ago         4.41MB
$ 
$ # 存在しないイメージの場合
$ docker image ls -q alpaca
$ 
$ # 存在するイメージの場合
$ docker image ls -q alpine
3f53bb00af94 
```

## TS; DR <sub><sup>（応用）</sup></sub>

指定したイメージがない場合に新規イメージをビルドする例。

```shell-session:find_image.sh
#!/bin/bash

NAME_IMAGE='sample/hoge';

if [ "$(docker image ls -q "$NAME_IMAGE")" ]; then
    echo "Image ${NAME_IMAGE} already exist."
    # Do something
    exit 1
fi

echo "Image ${NAME_IMAGE} does not exist."
# Do something
echo 'Now building image ...'
docker build -t "$NAME_IMAGE" .
```

```shell-session:実行サンプル
$ # 既存イメージの手動確認
$ docker image ls
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
busybox                 latest              3a093384ac30        2 days ago          1.2MB
alpine                  latest              3f53bb00af94        13 days ago         4.41MB
jwilder/nginx-proxy     latest              1e3c23efda58        7 weeks ago         148MB
$ 
$ # イメージがない場合に自動作成するスクリプトの実行
$ ./find_image.sh
Image sample/hoge does not exist.
Now building image ...
Sending build context to Docker daemon  4.608kB
Step 1/8 : FROM alpine:3.8
3.8: Pulling from library/alpine
Digest: sha256:46e71df1e5191ab8b8034c5189e325258ec44ea739bba1e5645cff83c9048ff1
（以下略）
```

## あわせて読みたい

- [Dockerコマンド一覧](https://qiita.com/nimusukeroku/items/72bc48a8569a954c7aa2) @ Qiita