DockerのENTRYPOINT
命令は、コンテナのメインプロセスを定義するための強力なツールです。CMD
命令と合わせて習得することは、堅牢で再利用可能なDockerイメージを構築するために不可欠です。この記事では、ENTRYPOINT
とその実用的なアプリケーションについて探ります。
目次
ENTRYPOINT
命令の理解
DockerfileのENTRYPOINT
命令は、コンテナの起動時に最初に実行される主要な実行ファイルを指定します。コンテナの中核機能を定義します。CMD
とは異なり、ENTRYPOINT
に提供された引数はdocker run
コマンドによって上書きされません。代わりに、実行時引数と結合されます。これにより、実行時のカスタマイズを可能にしながら、一貫性のある予測可能な基本プロセスが保証されます。
例えば、ウェブサーバーイメージでは以下を使用できます。
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
これにより、コンテナの起動方法に関係なく、Apacheがフォアグラウンドで実行されることが保証されます。-D FOREGROUND
引数は、イメージに固有です。
ENTRYPOINT
への引数の渡し方
ENTRYPOINT
の真の威力は、docker run
コマンドから引数を受け入れる能力にあります。これらはENTRYPOINT
コマンドに追加され、イメージを変更せずにカスタマイズが可能になります。
次のDockerfile
を考えてみましょう。
ENTRYPOINT ["/bin/sh", "-c"]
CMD ["echo $1 && date"]
docker run my-image "Hello from ENTRYPOINT!"
を実行すると、「Hello from ENTRYPOINT!」と現在の時刻が表示されます。”Hello from ENTRYPOINT!”という引数はシェルに渡され、echo
コマンドによって実行されます。CMD
のdate
コマンドも実行されます。
より高度な例として、ポート番号を受け取るスクリプトがあります。
#!/bin/bash
PORT="${1:-8080}" # 引数が指定されていない場合は8080をデフォルトとして使用します。
echo "Starting server on port: $PORT"
# ... $PORT を使用するサーバーロジック ...
ENTRYPOINT
vs. CMD
:詳細な比較
ENTRYPOINT
はメインプロセスを定義し、CMD
はそのプロセスのデフォルト引数を提供します。両方が存在する場合、docker run
引数はENTRYPOINT
コマンドに追加され、CMD
引数は上書きされます。CMD
のみが指定されている場合、メインプロセスとして機能します。中核機能にはENTRYPOINT
を、デフォルトまたは簡単に上書き可能なオプションにはCMD
を使用してください。
実践例とベストプラクティス
例1:シンプルなPythonアプリケーション
COPY . /app
WORKDIR /app
ENTRYPOINT ["python3", "my_app.py"]
これにより、Pythonアプリケーションが直接実行されます。docker run
への引数はすべてmy_app.py
に渡されます。
例2:より複雑なコマンドのためのシェルの使用
ENTRYPOINT ["/bin/bash", "-c"]
CMD ["npm start"]
ここでは、シェルから始めて、必要なコマンド(デフォルトのnpm start
またはdocker run
から上書きされたコマンド)を実行できます。
ベストプラクティス:
- コアコマンドには
ENTRYPOINT
を使用します。 - デフォルト引数または簡単に変更可能な設定には
CMD
を使用します。 ENTRYPOINT
スクリプト内で常に引数を安全に処理し、有効性を確認し、分かりやすいエラーメッセージを提供します。
結論
ENTRYPOINT
は基本的なDocker命令であり、堅牢で再利用可能、そして適応可能なコンテナイメージの作成を可能にします。CMD
との相互作用を理解することは、効果的なコンテナ化アプリケーションを開発するために重要です。ENTRYPOINT
とCMD
命令を注意深く作成することで、より信頼性が高く保守しやすいDockerイメージを構築できます。