🐳

【Docker】entry-point.sh の役割と使用例

2024/05/17に公開

はじめに

こんにちは、Takeです。都内の自社開発企業でエンジニアとして働いています。

この記事では主に以下について紹介いたします。

  • entry-point.shの役割
  • entry-point.shDockerfileのサンプルコード
  • entry-point.shが無くなったら困ること

entry-point.shのざっくりとした役割

entry-point.shはDockerコンテナ内で使用されるスクリプトであり、コンテナ起動時に実行される初期コマンドやスクリプトを指定するものです。

ENTRYPOINT命令をDockerfileに記述することで、このスクリプトはコンテナの「エントリーポイント」として機能し、コンテナが実行されるたびに自動的に呼び出されます。

entry-point.shのサンプルコード

#!/bin/bash
set -e

# 環境変数を設定
export APP_ENV=production

# データベースが起動しているか確認
until PGPASSWORD=$DB_PASS psql -h "$DB_HOST" -U "postgres" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"
exec "$@"

Dockerfileのサンプルコード

FROM postgres:13
COPY ./entry-point.sh /usr/local/bin/entry-point.sh
RUN chmod +x /usr/local/bin/entry-point.sh
ENTRYPOINT ["/usr/local/bin/entry-point.sh"]
CMD ["postgres"]

この例では、entry-point.shスクリプトがPostgresデータベースが利用可能になるまで待機し、その後にコンテナのメインプロセスを実行します。これにより、アプリケーションが起動時にデータベースに確実に接続できるようになります。

もし、entry-point.shがなくなったら困ること

環境設定の不整合

entry-point.shがない場合、環境設定の不整合が発生する可能性があります。期待される環境変数が設定されていないと、アプリケーションが正しく初期化されずにエラーを引き起こす可能性があります。

初期化処理の欠落

データベースのセットアップや外部サービスのチェックなどの重要な初期化ステップが実行されない場合、アプリケーションが適切に機能しない可能性があります。

シグナル処理の問題

コンテナがシグナルを適切に処理できない場合、終了や再起動のプロセスに問題が発生する可能性があります。これにより、アプリケーションの安定性と信頼性に影響を与えることがあります。

参考

https://docs.docker.jp/engine/articles/dockerfile_best-practice.html#entrypoint

https://docs.docker.jp/engine/reference/builder.html#entrypoint

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59

まとめ

entry-point.shのようなエントリーポイントスクリプトをDockerコンテナに使用することで、その堅牢性と信頼性を大幅に向上させることができます。

必要な初期化ステップがすべて実行されて環境変数が正しく設定されることで、一般的な落とし穴を避けてコンテナ化されたアプリケーションを効率的に運用できます。

最後に

ここまで読んでいただきありがとうございました!
今回の記事が良かったと思ったらぜひ「いいね」を押していただけると嬉しいです 🎉

noteでも記事を執筆していますので、ぜひチェックしてみてください。
https://note.com/take_lifelog/n/n58df7ce7af6f

他にもこのようなことについて記載しているのでお読みいただければ幸いです。

https://zenn.dev/take_tech/articles/275e5f4242973d

https://zenn.dev/take_tech/articles/374817f256ec9d

最後までお読みいただき、誠にありがとうございました!

Discussion