Dockerfile内でヒアドキュメントを使うな

2023年03月20日

Dockerfile内でヒアドキュメントを使うな

結論

  1. 途中でエラーになったかどうかわからない
  2. エラーになったにも関わらず、次の処理が走る

理由

RUN ... && \ から ヒアドキュメントに移行したら、めっちゃハマった 一応以下見てほしい

検証用Dockerfile(GitHub)

# syntax = docker/dockerfile:1
FROM debian:bullseye-slim

# No Error And Continue
RUN <<EOF
apt-get install -y notexist
echo "heredoc" >> /tmp/test
EOF

# Error And Stop
RUN apt-get install -y notexist \
  && echo "run" >> /tmp/test

RUN echo "Hello World" >> /tmp/test

最初はヒアドキュメント、次が通常のRUNが実行される 実行すると以下になる

...
 => [2/4] RUN <<EOF (apt-get install -y notexist...)
 => ERROR [3/4] RUN apt-get install -y notexist   && echo "run" >> /tmp/test
------
 > [3/4] RUN apt-get install -y notexist   && echo "run" >> /tmp/test:
#10 0.371 Reading package lists...
#10 0.424 Building dependency tree...
#10 0.425 Reading state information...
#10 0.432 E: Unable to locate package notexist
------
executor failed running [/bin/sh -c apt-get install -y notexist   && echo "run" >> /tmp/test]: exit code: 100

なお コンテナの中は以下になっている

root@0ee00222ebeb:~# cat /tmp/hoge
hoge

エラーから見てわかるように、失敗したが次のRUNが実行されてしまっている

これでは失敗したかわからない

RUN <<EOF (apt-get install -y notexist...)

おそらくRUNの最後のコマンドの終了ステータスが成功していれば、成功なのだろう

また、ヒアドキュメントを使うことによって、ミスを生む原因になるので、使わない方が良さそう