課題
とあるDockerfileをビルドしたときに Empty continuation line found in ... Empty continuation lines will become errors in a future release
の警告が出た。これにどう対処すべきか。
以下のようにバックスラッシュによる行継続における空行(empty continuation line)を含んでいてもDockerfileは有効で、実際にビルド可能かつこの例では apt update
と認識・動作する。
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.
...
空行の替わりにコメント文だと警告メッセージは出力されない。また、行継続を示すバックスラッシュのみの行が含まれていても大丈夫。
FROM debian
RUN apt \
\
# comment
update
Dockerfileでは(警告が出力されるとはいえ)空行が許容されること、途中でコメント行が許容されることを知らなかった。どちらもシェルスクリプトでは許容されないため。
また、エラーメッセージでググるとかなり昔からこの警告メッセージは出力されている様子。警告メッセージにあるエラー扱いになるリリースとは、どのようなリリーススケジュールになっているのだろうか?
どうするべきか
継続行の中で空行は使わない
警告の通り、継続行の中では空行は使わない。警告が出た場合は、バックスラッシュのみの行に修正する・コメントの行に修正する、といった対策を取る必要がある。
過去の仕様との互換性のために残しているだけで、ドキュメントにも空行が許容されることは記載されていない。Dockerfile reference にバックスラッシュによる改行直後もコメント行が利用可能であることが記載されているが、空行については触れられていない。
エラー扱いにDockerfileの仕様変更するのは大変そうでスケジュールの目処は経っていない(Dockerfileに仕様バージョンのようなものがない)のですぐにこの挙動が変更になることはないが、継続行の中で空行を利用しているケースがあれば気付いた範囲で修正した方がよさそう。
コメントはOK
一時期(v17.07.0からv17.10.0まで)は継続行中のコメント行も警告メッセージが出力されていた。
この不具合は修正され、17.10.0からは継続行の中でコメント行が含まれていても警告メッセージは出力されなくなった。
これにより、警告メッセージを抑制するために何もしない:
コマンドを利用するといった方法は不要になった。
複数命令への分割
どうしても空行を加えたい場合などは意味的に大きな違いを持つ場合はRUN命令などを分割することを検討した方がよい。
ただし、RUN命令の分割はイメージレイヤの分割を意味するので本当にRUN命令の分割を行うべきか検討が必要。
場合によってはマルチステージビルドの利用を検討した方がよい。
同じ継続行を利用する場合でも、ENVやLABELでは命令を分割してもイメージレイヤは生成されない。
このため、ENVやLABELでは継続行を使わないという選択肢もある。LABEL命令は v1.10までは複数LABEL命令を利用するとイメージサイズが増加していたが、現在は複数LABEL命令を利用しても影響ないので積極的に分割してよい。ENV命令も1つの命令で複数キーペアを指定したりバックスラッシュで整形したりしても、複数ENV命令で実装した場合と同じイメージが生成されると記載されている。
参考
- [2021-02-17]CircleCI で docker build するときの Empty continuation lines will become errors in a future release. という warning への対処方法
- [2019-03-14]ビルド時に[WARNING]: Empty continuation line found in: が出る
- [2017-10-12]"Empty continuation lines will become errors"… how should I comment my Dockerfile now?
- [2017-10-02]dockerでbuildしたら"Empty continuation lines will become errors in a future release"って言われた