ENTRYPOINTはDockerの最も重要な設定オプションの1つです。これはDockerfileにあり、コンテナのデフォルトでの動作を指定できます。この機能により、ENTRYPOINTは、実行時のコンテナの動作を自動化するのに非常に有用です。
この記事では、DockerにおけるENTRYPOINTの使い方について、その仕組みや必要不可欠な理由、正しい設定方法などをご紹介します。
Docker ENTRYPOINTとは
ENTRYPOINT は、Dockerコンテナのランタイムプロセスの開始点として機能します。Dockerイメージを作成し、コンテナとしてインスタンス化すると、デフォルトでENTRYPOINTが実行されます。
ENTRYPOINTでは、ウェブサーバー、データベース、アプリケーションの実行など、コンテナの主な目的を設定できます。また、実行時に引数を渡して、コンテナの動作をカスタマイズすることも可能です。
ENTRYPOINTの構文と使用法
DockerファイルでENTRYPOINTを定義する構文には、shell形式とexec形式の2種類があります。どちらもDockerfileに行を挿入することになりです。ENTRYPOINTのコンフィギュレーションはビルドプロセスに直接影響しないので、ファイル内のどこに記述しても構いません。しかし、ほとんどのプログラマーがENTRYPOINTコマンドを最後の方に置く傾向があります。
shell形式の構文
ENTRYPOINTをshell形式で実行すると、コマンドシェルの呼び出しと処理が行われます。この方法には環境変数の置換が含まれますが、exec形式で引数を追加する機能はブロックされます。
ENTRYPOINT command param1 param2
ここでは、commandがコンテナ起動時に実行される主コマンドです。param1とparam2はコマンドの引数になります。
exec形式の構文
exec形式はコマンドシェルを起動しません。代わりに、指定されたコマンドとパラメータを直接実行します。この方法では、CMDまたはランタイムコマンドライン経由で引数を追加できます。
ENTRYPOINT ["executable", "param1", "param2"]
ここでは、executableが主コマンドで、param1とparam2が実行ファイルへの引数です。
ENTRYPOINTの実行
DockerfileのシンプルなENTRYPOINTコマンドで、その動作を確認してみましょう。この命令はビルド時ではなく、実行時に処理されるため、コンテナを起動せずにテストすることはできません。
以下はexec形式を使った例です。
ENTRYPOINT ["python", "app.py"]
このコンテナは起動時にPythonインタプリタを起動し、app.pyスクリプトを実行します。
この例をshell形式で繰り返すには、少し変更を加えます。
ENTRYPOINT python app.py
この例では、Pythonインタプリタを直接実行するのではなく、シェルコマンドから起動しています。
ENTRYPOINT CMD
CMDはDockerfileの命令で、実行コンテナのデフォルト引数を指定します。実行可能なコマンドの形式を取るか、ENTRYPOINTの命令の追加パラメータとして機能します。コンテナを起動する際、docker runコマンドに引数を指定することで、このパラメータを上書きすることもできます。
ENTRYPOINTと同様に、CMDもexecまたはshell形式で記述できます。主な違いは、CMDが、コマンドラインからオーバーライドできるデフォルトのコマンドやパラメータを設定する点です。一方、ENTRYPOINTは、コンテナが実行可能ファイルとして利用されるように設定します。つまり、コマンドラインからコマンドを上書きすることはできません。
CMDを使ってENTRYPOINTの機能を拡張し、イメージの柔軟性を高めることができます。この2つを組み合わせると、CMDの値がENTRYPOINTのデフォルトの引数として機能し、イメージの動作をカスタマイズ可能です。この方法では、ENTRYPOINTでデフォルトコマンドを設定し、CMDでデフォルト引数を設定することができます。
ENTRYPOINTを単独で使うのとは異なり、この方法ではdocker run で渡されたパラメータを上書きすることが可能です。
上記の例をより柔軟にするには、CMDコマンドを以下のように使用します。
ENTRYPOINT ["python", "app.py"]
CMD ["--help"]
この例では、コマンドライン引数を指定せずにDockerコンテナを起動すると、python app.py --helpがデフォルトで実行されます。しかし、コンテナの起動時に引数(docker run <image> --version など)を指定すると、デフォルトのCMD引数が置き換えられ、python app.py --version が実行されます。この方法によって、コンテナを実行する際の柔軟性が高まります。
DockerにおけるENTRYPOINTの使用例
ENTRYPOINTの最も一般的な使用方法は、特定のアプリケーションやサービス用のイメージを設定することです。例えば、Pythonアプリケーションを実行するイメージを作成するには、ENTRYPOINTを使用してPythonインタプリタを実行するように指定できます。
また、継続的インテグレーションと継続的デプロイメント(CI/CD)パイプライン用のDockerイメージを構築する際にも、ENTRYPOINTが使用できます。これらのイメージを使用して、各ステージに必要な環境をカプセル化し、一貫性を確保することができます。例えば、ENTRYPOINTをテストスクリプトに設定した Docker イメージを作成できます。このイメージは、実行するたびにテストを自動で行い、一貫性のある再現可能なテスト環境を可能にします。
ENTRYPOINTは、コンテナ化されたアプリケーションのデバッグにも便利です。ENTRYPOINTでシェルセッションを開始することで、コンテナ内のアプリケーション環境と対話することができます。その対話には、コマンドの実行、ファイルの探索、アプリケーションの状態の検査などが含まれます。問題を解決したら、アプリケーションを実行するために、適切なENTRYPOINT、Dockerイメージを再構築することができます。
ENTRYPOINTをオーバーライドする方法
柔軟性を高めるために、実行時にDockerイメージのENTRYPOINTをオーバーライドすることができます。これを行うには、docker runコマンドでイメージ名の後にコマンドを指定します。
例えば、イメージのENTRYPOINTにPythonスクリプトが指定されているものの、代わりにコンテナ内でシェルを開きたい場合には、以下を実行できます。
docker run --entrypoint <image> “/bin/bash”
このスクリプトがアプリケーションのデフォルトのENTRYPOINTを上書きし、bashシェルを起動します。
同様に、別のPythonスクリプトを実行するには、そのスクリプトをコマンドとして指定します。この方法によって、Dockerfileの ENTRYPOINTに元々記述されているパラメータとは異なるパラメータでコンテナを実行する柔軟性が得られます。
DockerでENTRYPOINTを使用するベストプラクティス
ENTRYPOINTはDockerにとって非常に重要なコマンドであるため、以下のベストプラクティスに従うことが重要です。
コンテナを単一の責任に集中させる
ENTRYPOINTはDockerコンテナの責任を特定する役割を果たします。マイクロサービスのように、各コンテナは単一の責任、サービス、またはアプリケーションの一部に焦点を当てることが推奨されます。このアプローチにより、アプリケーションのモジュール性とスケーラビリティが向上し、開発、テスト、保守が容易になります。
ENTRYPOINTスクリプトが実行可能で、適切なフォーマットであることを確認する
ENTRYPOINTスクリプトを実行可能で適切な形式にすることで、構文エラーや権限エラーなどの問題を防ぐことができます。
ENTRYPOINTスクリプトが実行可能であることを確認するには、次のRUN chmod +xを使用することができます。
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
この例では、entrypoint.shスクリプトをコンテナにコピーし、RUN chmod +xの命令を使用して実行可能にしています。次に、ENTRYPOINTを定義して、entrypoint.shスクリプトを使用します。
ShellCheckのようなリンターを使用して、スクリプトの構文とスタイルをチェックし、適切なフォーマットを確保することもできます。
ENTRYPOINTスクリプトの値のハードコーディングを避ける
ハードコーディングの代わりに環境変数やコマンドライン引数を使用すると、スクリプトをより柔軟にすることができます。また、コンテナの外からファイルパスを設定することもできます。
たとえば、ENTRYPOINTスクリプトでファイルパスをハードコーディングで記述する代わりに、次のようにします。
#!/bin/bash
echo "Starting my application..."
./my-app -f /path/to/my/file.txt
そして、以下のように変数を使うことができます。
#!/bin/bash
echo "Starting my application..."
./my-app -f "${MY_FILE}"
変数を使うことで、イメージをその場でカスタマイズし、Dockerfileを書き換えることなく、より多くのことができるようになります。
DockerとKinstaの連携
Kinstaは、Dockerを使用してウェブアプリケーションをデプロイするのにぴったりの柔軟なプラットフォームです。カスタムDockerイメージの構築とデプロイを支援し、サーバー環境のコントロールと柔軟性を最大限に高めます。
カスタムサーバー環境を構築する場合でも、多くのトラフィックを処理するためにアプリケーションをスケーリングする場合でも、Kinstaの性能やツール、サポートをご利用ください。
まとめ
ENTRYPOINTはDockerコンテナ設定に不可欠なツールです。コンテナがイメージから起動するときに実行されるデフォルトのコマンドを設定し、その主な機能を定義します。ENTRYPOINTを使って特定のアプリケーションを実行したり、CI/CDパイプラインに役立てたり、CMDと組み合わせて柔軟なコンテナの動作を実現したりできます。
Dockerは現在、高い人気を誇る開発者ツールであり、多様なコンテナ化されたデプロイメントに不可欠です。Dockerの詳細については、Kinstaの各種記事でご紹介しています。コンテナ化したアプリケーションをホスティングするKinstaのクラウドサーバープランのチェックもお忘れなく。
Kinstaは開発ワークフローの簡素化と効率化を可能にするソリューションです。37のデータセンター、C2マシン、GCPインフラストラクチャ上でのアプリケーションコンテナ化、300以上のPoints of Presence(PoP)で構成される高性能CDNに代表されるCloudflare統合、エンタープライズレベルのファイアウォールDDoS攻撃対策、エッジキャッシュ、稼働状況監視(99%の稼働率保証)などの機能により、お客様のアプリケーションの高速かつセキュアな実行を後押しします。