Rails7.1でDockerfileの自動生成機能が追加された
しかし、この機能は開発環境様ではなく本番環境用のファイルなので
実際開発を行う際には手動でDockerfileを作成する必要がある
今まで利用してきて居た Dockerfile では entrypoint の記述を以下のようにして居た。
COPY entrypoint_dev.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint_dev.sh
ENTRYPOINT ["entrypoint_dev.sh"]
EXPOSE 8080
CMD ["rails", "server", "-p", "8080", "-b", "0.0.0.0"]
entrypoint.sh を専属で用意
ファイルをコピーし、実行権限を付与
そしてスクリプトファイルを ENTRYPOINT に指定して居ました。
Rails7.1 での ENTRYPOINT の指定
今回自動生成されるようになった Dockerfile では以下のようになって居た。
恐らく これがプログラマー界隈の中では、当たり前で前から使われていた設定だと思うのですが
今回railsをアップデートして初めて知りました
# railsという名前の新しいユーザーアカウントを作成
RUN useradd rails --create-home --shell /bin/bash
# log、storage、tmpというディレクトリの所有者とグループをrailsに変更
RUN chown -R rails:rails db log storage tmp
# USER命令は、以降の命令やDockerコンテナの実行時に使用されるユーザーとグループを設定
USER rails:rails
# ENTRYPOINT命令はコンテナが起動する際に実行されるコマンドを指定。
ENTRYPOINT ["/rails/bin/docker-entrypoint"]
ChatGPTによるとこんなメリットがあるようです。
確かに非rootユーザーで実行されるのは良いですね、また標準化という点も素晴らしいと思います
他社に転職した際や他プロジェクトでも同様の構成で動作していると、過去の経験が生きます。
セキュリティ
非rootユーザー(この場合はrailsユーザー)でアプリケーションを実行することで、セキュリティを強化します。これにより、権限の昇格攻撃などのリスクを軽減できます。
本番環境向け
自動生成されたDockerfileは、本番環境での使用を想定しています。そのため、パフォーマンス、セキュリティ、安定性に重点を置いた設定が含まれています。
標準化
Railsによって自動生成されることで、Dockerfileの構造が標準化され、Railsコミュニティ内での一貫性が保たれます。