・Dockerfileでヒアドキュメント構文の使い方紹介
・ヒアドキュメントを使わない方法との比較
先日、Docker公式ブログにて、ヒアドキュメントが公式でサポートされることになりました。
すでに機能自体はあったようですが問題がありずっと放置されていましたが解決されたためサポート範囲になったところです。
ヒアドキュメントを使うことでRUNコマンドの複数行で使われる「&& \」を使わず可読性が増すと思われます。
ヒアドキュメントは昔PHPを学習したときに知ったのですが、PHPはヒアドキュメントを非推奨だったのであまり良い思い出が無いです。
個人的に良い思い出が無いものが別サービスだとサポートしていると言っているので使うパターン、使わないパターンで比較しながら紹介出来ればと思います。
環境情報
検証用に使う言語はRuby on Railsです。
別件ですがRuby on RailsとNginxをDockerで使う方法については下記を参考ください。
ヒアドキュメントを使わないパターン
まずはヒアドキュメントを使わないパターンです。
FROM ruby:2.6.3
RUN apt-get update && apt-get install -y build-essential libpq-dev postgresql-client nodejs
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn
# Node.jsをインストール
RUN curl -fsSL https://deb.nodesource.com/setup_14.x | bash -
RUN gem install rails -v 5.2.1
4行目から8行目までが、1つのRUNコマンドで実行されています。
1つのRUNコマンドで実行するために「&& \」を行末尾につけています。
このままでも動くことは動きますが、行末尾にある「&& \」は忘れる恐れがあったり、そもそも見づらい印象です。(書き方の問題かもしれませんが)
ヒアドキュメントを使うパターン
FROM ruby:2.6.3
RUN apt-get update && apt-get install -y build-essential libpq-dev postgresql-client nodejs
RUN <<EOF
apt-get update && apt-get install -y curl apt-transport-https wget
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
apt-get update && apt-get install -y yarn
EOF
# Node.jsをインストール
RUN curl -fsSL https://deb.nodesource.com/setup_14.x | bash -
RUN gem install rails -v 5.2.1
続いてヒアドキュメントを使うパターンです。
4行目を「RUN <<EOF」に変更して、9行目の「EOF」の間に実行するコマンドを記載します。
先頭に空白を入れてインデントを揃えるようにしても実行可能です。
上記Dockerfileを実行してコンテナ作成後、「rails s -b 0.0.0.0」コマンドからPumaを立ち上ると問題無くRailsの画面が表示されます。

注意点
ヒアドキュメントを使うことで可読性が増し、「&& \」を行末尾に入れる必要が無くなったため多少は保守性が向上します。
しかし残念ながら、現時点(2021年8月中旬)ではVSCode側が対応していません。

ヒアドキュメント内のコマンドはエラーと判定されてしまいます。
それだけではなく、VSCode Remote Developmentプラグインからもエラーと判定されリモート接続が出来ません。
ERROR: Service 'app' failed to build : Build failed
ターミナルから「docker-compose up -d」コマンドを実行すると問題無く動作するためVSCode側だと考えます。
エラー内容的にdocker-composeのようですが上記の通りターミナルからは動くので違う印象です。
2021年7月末にサポートされたので追いついていないと思って気長に待ちます。