Docker超入門:ENTRYPOINT・ENV・WORKDIRでコンテナの動作を制御する

 Dockerfileを作るとき、コンテナの動作を細かく制御するために便利なのが ENTRYPOINT・ENV・WORKDIR の3つの命令です。
これらをうまく組み合わせることで、「コンテナをどう起動するか」「環境変数でどうカスタマイズするか」「作業ディレクトリをどこにするか」を柔軟に設定できます。

ENTRYPOINTで実行コマンドを固定する

 ENTRYPOINT命令は、コンテナを起動したときに必ず実行されるデフォルトのコマンドを設定します。
 CMDと似ていますが、ENTRYPOINTは「実行するコマンドを固定し、必要なら引数だけ差し替える」イメージで使います。

書式

  • Exec形式(推奨)
ENTRYPOINT ["コマンド", "引数1", "引数2", ...]
  • Shell形式
ENTRYPOINT コマンド 引数1 引数2 ...

使用例

ENTRYPOINT ["nginx", "-g", "daemon off;"]

この場合、コンテナ起動時に必ずnginxが実行され、バックグラウンドで動作します。

Exec形式が推奨される理由

Exec形式はJSON配列で記述されるため、シェルを介さずに直接実行されます
 これにより、OSシグナル(例: SIGTERM)をプロセスが正しく受け取れるため、プロセス制御や停止処理が安全に行えるというメリットがあります。
 一方でShell形式だと、シェルを経由するためシグナルが正しく伝わらず、コンテナ停止時に予期しない挙動をすることがあります。

ENVで環境変数を設定する

ENV命令は、コンテナ内で使える環境変数をあらかじめ設定できます。
アプリケーションの設定値や接続情報を柔軟に変えたいときにとても便利です。

書式

ENV [key] [value]
ENV [key]=[value]

使用例

ENV name "John"
ENV addr="New York"

コンテナ内で echo $name を実行すると John が出力されます。
 設定ファイルを書き換えなくても、環境変数を使って動作を切り替えられるのが大きなポイントです。

WORKDIRで作業ディレクトリを指定する

 WORKDIR命令は、その後に続く命令(RUN、CMD、ENTRYPOINT、COPYなど)が実行されるディレクトリを指定します。
毎回 cd コマンドを打たなくてもよいので、とても便利です。

書式

WORKDIR [作業ディレクトリのパス]

使用例

WORKDIR /workdirectory

この指定以降の処理はすべて /workdirectory を基準に実行されます。
例えば COPY app.py . と書けば /workdirectory/app.py にコピーされます。

3つの命令の比較表

命令役割主な用途書式例
ENTRYPOINTコンテナ起動時に必ず実行するコマンドを設定Webサーバーやアプリの起動ENTRYPOINT ["nginx", "-g", "daemon off;"]
ENV環境変数を設定接続情報やアプリの設定値を動的に管理ENV MODE=production
WORKDIR作業ディレクトリを指定アプリの配置や実行場所を統一WORKDIR /app

まとめ

  • ENTRYPOINT は「コンテナ起動時に実行するコマンド」を固定する
  • ENV は「環境変数を設定して、動作を柔軟に変えられる」
  • WORKDIR は「作業ディレクトリを指定して効率よくファイルを扱える」

この3つを活用すれば、コンテナの動作を思い通りにコントロールできます。
 特に ENTRYPOINTはExec形式を使うのがベストプラクティス なので、ぜひ覚えておきましょう。