続 multi stageなDockerfileで中間イメージにタグをつける

[multi stageなDockerfileで中間イメージにタグをつける - Qiita](https://qiita.com/yagince/items/33a7e4d1818cb7b9648e)

以前書いた方法だと、tagをつける為にビルドする必要がありました。
これだと、ビルドステージが重い場合に時間がかかるので、別の方法でやることにしました。

# 結論

[Tag Intermediate Build Stages (multi-stage build) - General Discussions - Docker Forums](https://forums.docker.com/t/tag-intermediate-build-stages-multi-stage-build/34795/2)

↑ここに書かれているようにラベルをつけて、そのラベルを後から使います。

# multi-stageなDockerfile

```dockerfile
# build stage
FROM rust:1.26.1-slim-stretch AS build-stage
LABEL build_stage=true

RUN mkdir -p /app
WORKDIR /app

COPY . /app
RUN cargo build --release

# runtime stage
FROM debian:stretch-slim

COPY --from=build-stage /app/target/release/multi-stage /usr/bin/multi-stage

ENTRYPOINT ["/usr/bin/multi-stage"]
```

`LABEL build_stage=true`

これを後で使います。
ビルドしてみます。

```shell
❯ docker build -t multi .
Sending build context to Docker daemon  10.75kB
Step 1/9 : FROM rust:1.26.1-slim-stretch AS build-stage
 ---> b918abbd27e1
Step 2/9 : LABEL build_stage=true
 ---> Running in fecf0500419f
Removing intermediate container fecf0500419f
 ---> f1b19a013ed6
Step 3/9 : RUN mkdir -p /app
 ---> Running in c1c48548df47
Removing intermediate container c1c48548df47
 ---> 9d92571aafe5
Step 4/9 : WORKDIR /app
 ---> Running in 16ccc4b9ac47
Removing intermediate container 16ccc4b9ac47
 ---> d0b30d55a142
Step 5/9 : COPY . /app
 ---> b9f676a65421
Step 6/9 : RUN cargo build --release
 ---> Running in 81b1e65a3555
    Updating registry `https://github.com/rust-lang/crates.io-index`
 Downloading regex v1.0.0
 Downloading utf8-ranges v1.0.0
 Downloading thread_local v0.3.5
 Downloading aho-corasick v0.6.4
 Downloading regex-syntax v0.6.0
 Downloading memchr v2.0.1
 Downloading lazy_static v1.0.1
 Downloading unreachable v1.0.0
 Downloading void v1.0.2
 Downloading libc v0.2.42
 Downloading ucd-util v0.1.1
   Compiling libc v0.2.42
   Compiling void v1.0.2
   Compiling ucd-util v0.1.1
   Compiling regex v1.0.0
   Compiling lazy_static v1.0.1
   Compiling utf8-ranges v1.0.0
   Compiling unreachable v1.0.0
   Compiling thread_local v0.3.5
   Compiling regex-syntax v0.6.0
   Compiling memchr v2.0.1
   Compiling aho-corasick v0.6.4
   Compiling multi-stage v0.1.0 (file:///app)
    Finished release [optimized] target(s) in 21.8 secs
Removing intermediate container 81b1e65a3555
 ---> 525373ad0be0
Step 7/9 : FROM debian:stretch-slim
 ---> 26f0bb790e25
Step 8/9 : COPY --from=build-stage /app/target/release/multi-stage /usr/bin/multi-stage
 ---> 9430c7ee67c3
Step 9/9 : ENTRYPOINT ["/usr/bin/multi-stage"]
 ---> Running in 61660ed57369
Removing intermediate container 61660ed57369
 ---> 986818ec9ad3
Successfully built 986818ec9ad3
Successfully tagged multi:latest
```

```shell
❯ docker images
REPOSITORY                                 TAG                                IMAGE ID            CREATED              SIZE
multi                                      latest                             986818ec9ad3        About a minute ago   61.8MB
<none>                                     <none>                             525373ad0be0        About a minute ago   991MB
```

# LABELを使ってFilterしてIDを取得してタグをつける

```shell
❯ docker images --filter 'label=build_stage=true'
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              525373ad0be0        3 minutes ago       991MB
```

これで、build-stageにしたイメージが取得できます。
では、これにオプションをつけてIDのみ取得し、そのIDにタグをつけます。

```shell
❯ docker tag $(docker images --filter 'label=build_stage=true' -q | head -n 1) multi:build-stage-cache
```

- `-q` オプションでIDのみ取得
- 複数ある可能性があるので、 `head -n 1` で先頭の1個だけ取得
- ↑のIDを使って、`docker tag`を実行

```shell
❯ docker images
REPOSITORY                                 TAG                                IMAGE ID            CREATED             SIZE
multi                                      latest                             986818ec9ad3        6 minutes ago       61.8MB
multi                                      build-stage-cache                  525373ad0be0        6 minutes ago       991MB
```

めでたくタグをつけることができました。
一回全部ビルドしてしまって、後からタグをつけた方が、ビルド回数が減って速くなりますね。