Dockerfileにおけるempty continuation lineの扱い

## 課題
とあるDockerfileをビルドしたときに `Empty continuation line found in ... Empty continuation lines will become errors in a future release` の警告が出た。これにどう対処すべきか。


以下のようにバックスラッシュによる行継続における空行(empty continuation line)を含んでいてもDockerfileは有効で、実際にビルド可能かつこの例では `apt update` と認識・動作する。

```Dockerfile
FROM debian

RUN apt \

    update
```

ただし警告メッセージが出力される。

```
$ docker build .
...
[WARNING]: Empty continuation line found in:
    RUN apt     update
[WARNING]: Empty continuation lines will become errors in a future release.
...
```

空行の替わりにコメント文だと警告メッセージは出力されない。また、行継続を示すバックスラッシュのみの行が含まれていても大丈夫。

```Dockerfile
FROM debian

RUN apt \
        \
    # comment
    update
```

Dockerfileでは(警告が出力されるとはいえ)空行が許容されること、途中でコメント行が許容されることを知らなかった。どちらもシェルスクリプトでは許容されないため。
また、エラーメッセージでググるとかなり昔からこの警告メッセージは出力されている様子。警告メッセージにあるエラー扱いになるリリースとは、どのようなリリーススケジュールになっているのだろうか？

<!--
 ## Empty continuation line対応の歴史
 ### [2016-12-01] [Parser in docker 1.13 breaks backwards compatibility for comments in middle of RUN statement #29005](https://github.com/moby/moby/issues/29005)
docker1.6以降のバージョンでは、コメント行は無視してビルドしてくれた。
例えば以下のDockerfileは正常にビルドできる。

```Dockerfile
FROM alpine
RUN echo \
# comment
hi
```

これが [パーサ改良のプルリク#24725](https://github.com/moby/moby/pull/24725)(v1.13.0-rc1でリリース)に含まれている不具合の影響でビルドできなくなってしまった。この不具合を報告するissue。
このプルリク#24725にて継続行における空行の扱いなどが議論された。結局プルリク#24725では空行をどのように扱うかは対応しないことが決定した。

[issue#29005の中](https://github.com/moby/moby/issues/29005#issuecomment-264166814)で空行やコメント行の扱いについて仕様が議論されたが、

 ### [2016-12-03][ Revert "Fix dockerfile parser with empty line after escape" #29064 ](https://github.com/moby/moby/pull/29064)
issue#29005で議論の結果、まずは従来の挙動と同じくなるようにプルリク#24725をrevertすることが決定された。


 ### [2017-06-17][[Builder] Warn on empty continuation lines #33719](https://github.com/moby/moby/pull/33719)
[[Builder] Warn on empty continuation lines #33719](https://github.com/moby/moby/pull/33719)および[Warn/deprecate continuing on empty lines in Dockerfile #29161](https://github.com/moby/moby/pull/29161) で実装された。
docker 17.07から変更が適用されている。

従来からRUN命令の改行に空行を含めていてもRUN命令が継続する仕様だったが、このせいでビルドがエラーになり気付けないという問題もあった。
空行が含まれている場合はRUN命令を継続しない仕様に修正することも検討されたが、既存の多くのDockerfileに影響があることから警告メッセージを出力するだけに留めることが決定された。
また、この仕様は将来エラーにする予定ではあるが、いつエラーにするかまでは決めることができないことも[コメントされている](https://github.com/moby/moby/pull/29161#issuecomment-287165395)。




 ### [2017-11-03] [False positive "Empty continuation lines will become errors in a future release." #35387](https://github.com/moby/moby/issues/35387)
以下のようなコメント行を含む場合でも警告が出る。
従来は警告なしにコメントを除外してくれていたが、 #29005

```Dockerfile
FROM ubuntu:xenial
RUN echo \
        # descriptive comment
        hello
```

この内容を踏まえて、[コメント行には警告を出さない修正](https://github.com/moby/moby/pull/35004)が実装・マージされた。
docker 17.10 からこの修正がリリースされている。

-->
## どうするべきか

### 継続行の中で空行は使わない
警告の通り、継続行の中では空行は使わない。警告が出た場合は、バックスラッシュのみの行に修正する・コメントの行に修正する、といった対策を取る必要がある。


過去の仕様との互換性のために残しているだけで、ドキュメントにも空行が許容されることは記載されていない。[Dockerfile reference](https://docs.docker.com/engine/reference/builder/#format) にバックスラッシュによる改行直後もコメント行が利用可能であることが記載されているが、空行については触れられていない。

エラー扱いにDockerfileの仕様変更するのは大変そうでスケジュールの目処は経っていない(Dockerfileに仕様バージョンのようなものがない)のですぐにこの挙動が変更になることはないが、継続行の中で空行を利用しているケースがあれば気付いた範囲で修正した方がよさそう。


### コメントはOK
一時期(v17.07.0からv17.10.0まで)は継続行中のコメント行も警告メッセージが出力されていた。
この不具合は修正され、17.10.0からは継続行の中でコメント行が含まれていても警告メッセージは出力されなくなった。

これにより、警告メッセージを抑制するために何もしない`:`コマンドを利用するといった方法は不要になった。

### 複数命令への分割
どうしても空行を加えたい場合などは意味的に大きな違いを持つ場合はRUN命令などを分割することを検討した方がよい。
ただし、RUN命令の分割はイメージレイヤの分割を意味するので本当にRUN命令の分割を行うべきか検討が必要。
場合によっては[マルチステージビルド](https://docs.docker.com/develop/develop-images/multistage-build/)の利用を検討した方がよい。

同じ継続行を利用する場合でも、ENVやLABELでは命令を分割してもイメージレイヤは生成されない。
このため、ENVやLABELでは継続行を使わないという選択肢もある。[LABEL命令](https://docs.docker.com/engine/reference/builder/#label)は v1.10までは複数LABEL命令を利用するとイメージサイズが増加していたが、現在は複数LABEL命令を利用しても影響ないので積極的に分割してよい。[ENV命令](https://docs.docker.com/engine/reference/builder/#env)も1つの命令で複数キーペアを指定したりバックスラッシュで整形したりしても、複数ENV命令で実装した場合と同じイメージが生成されると記載されている。


## 参考
- [2021-02-17][CircleCI で docker build するときの Empty continuation lines will become errors in a future release. という warning への対処方法](https://developer.feedforce.jp/entry/2021/02/17/110000)
- [2019-03-14][ビルド時に[WARNING]: Empty continuation line found in: が出る](https://www.canned-catfood.com/2019/03/warning-empty-continuation-line-found-in-while-building/)
- [2017-10-12]["Empty continuation lines will become errors"… how should I comment my Dockerfile now?](https://stackoverflow.com/questions/46708053/empty-continuation-lines-will-become-errors-how-should-i-comment-my-dockerfil)
- [2017-10-02][dockerでbuildしたら"Empty continuation lines will become errors in a future release"って言われた](https://qiita.com/kekedadamama/items/78e55c390dd9b6b13b52)