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がコンテナ起動時に実行される主コマンドです。param1param2はコマンドの引数になります。

exec形式の構文

exec形式はコマンドシェルを起動しません。代わりに、指定されたコマンドとパラメータを直接実行します。この方法では、CMDまたはランタイムコマンドライン経由で引数を追加できます。

ENTRYPOINT ["executable", "param1", "param2"]

ここでは、executableが主コマンドで、param1param2が実行ファイルへの引数です。

ENTRYPOINTの実行

DockerfileのシンプルなENTRYPOINTコマンドで、その動作を確認してみましょう。この命令はビルド時ではなく、実行時に処理されるため、コンテナを起動せずにテストすることはできません。

以下はexec形式を使った例です。

ENTRYPOINT ["python", "app.py"]

このコンテナは起動時にPythonインタプリタを起動し、app.pyスクリプトを実行します。

この例をshell形式で繰り返すには、少し変更を加えます。

ENTRYPOINT python app.py

この例では、Pythonインタプリタを直接実行するのではなく、シェルコマンドから起動しています。

ENTRYPOINT CMD

CMDDockerfileの命令で、実行コンテナのデフォルト引数を指定します。実行可能なコマンドの形式を取るか、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スクリプトを実行するには、そのスクリプトをコマンドとして指定します。この方法によって、DockerfileENTRYPOINTに元々記述されているパラメータとは異なるパラメータでコンテナを実行する柔軟性が得られます。

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インフラストラクチャ上でのアプリケーションコンテナ化、260+のPoints of Presence(PoP)で構成される高性能CDNに代表されるCloudflare統合、エンタープライズレベルのファイアウォールDDoS攻撃対策、エッジキャッシュ、稼働状況監視(99%の稼働率保証)などの機能により、お客様のアプリケーションの高速かつセキュアな実行を後押しします。

Marcia Ramos Kinsta

Kinstaのエディトリアルチームリード。大のオープンソース&コーディング好き。IT業界向けのテクニカルライティングと編集に7年以上携わり、的確かつ簡潔なコンテンツを制作しながら、チームで協力し合い、ワークフローの改善を行っている。