Skip to content

Instantly share code, notes, and snippets.

@goldeneggg
Created May 8, 2014 08:22
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save goldeneggg/e2b2d7ca9ea2e649df5f to your computer and use it in GitHub Desktop.
Save goldeneggg/e2b2d7ca9ea2e649df5f to your computer and use it in GitHub Desktop.
Dockerfileの CMD と ENTRYPOINT の挙動の違いメモ

CMDとENTRYPOINTの違いと、使用例

  • ざっくり概要として、CMDとENTRYPOINT どちらを使うかによって docker run CONTAINER_ID <command> した際の<command>が及ぼす影響 が変わる

CMD, ENTRYPOINTで オプションなしのコマンド を記述した場合

CMD 使用時

  • Dockerfile
FROM centos
MAINTAINER hoge

CMD ls
  • コマンド引数指定なし => CMDで指定したコマンドを実行するだけ
% docker run --rm IMAGE_ID
bin
boot
dev
etc
home
:
  • コマンド引数指定あり => 引数で指定したコマンドが実行される , CMDで指定したコマンドは無視(公式document的に言うと上書き)される
% docker run --rm IMAGE_ID ls -l
dr-xr-xr-x  2 root root  4096 Apr  1  2013 bin
dr-xr-xr-x  2 root root  4096 Sep 23  2011 boot
drwxr-xr-x  5 root root  4096 May  2 01:57 dev
drwxr-xr-x 43 root root  4096 May  2 01:57 etc
drwxr-xr-x  2 root root  4096 Sep 23  2011 home
:

ENTRYPOINT 使用時

  • Dockerfile
FROM centos
MAINTAINER hoge

ENTRYPOINT ls
  • コマンド引数指定なし => CMDで指定したコマンドを実行するだけ
% docker run --rm IMAGE_ID
bin
boot
dev
etc
home
:
  • コマンド引数指定あり -> ENTRYPOINTのコマンドがそのまま実行される , コマンド引数が無視される
% docker run --rm IMAGE_ID ls -l
bin
boot
dev
etc
home
:

CMD, ENTRYPOINTで オプションありのコマンド を記述した場合の挙動

CMD 使用時

  • Dockerfile
from centos
maintainer hoge

CMD ls -l
  • コマンド引数指定なし => CMDで指定したコマンドを実行するだけ
% docker run --rm IMAGE_ID
dr-xr-xr-x  2 root root  4096 Apr  1  2013 bin
dr-xr-xr-x  2 root root  4096 Sep 23  2011 boot
drwxr-xr-x  5 root root  4096 May  2 01:57 dev
drwxr-xr-x 43 root root  4096 May  2 01:57 etc
drwxr-xr-x  2 root root  4096 Sep 23  2011 home
:
  • コマンド引数指定あり -> 引数で指定したコマンド(とオプション)が実行される , CMDで指定したコマンドは無視(公式document的に言うと上書き)される
% docker run --rm IMAGE_ID ls -lh
dr-xr-xr-x  2 root root 4.0K Apr 12 01:10 bin
drwxr-xr-x  4 root root  80K May  2 06:30 dev
drwxr-xr-x 40 root root 4.0K May  2 06:30 etc
drwxr-xr-x  2 root root 4.0K Sep 23  2011 home
dr-xr-xr-x  2 root root  4096 Apr  1  2013 bin
dr-xr-xr-x  2 root root  4096 Sep 23  2011 boot
drwxr-xr-x  5 root root  4096 May  2 01:57 dev
drwxr-xr-x 43 root root  4096 May  2 01:57 etc
drwxr-xr-x  2 root root  4096 Sep 23  2011 home
:

ENTRYPOINT 使用時

  • Dockerfile
FROM centos
MAINTAINER hoge

ENTRYPOINT ls -l
  • コマンド引数指定なし => CMDで指定したコマンドを実行するだけ
% docker run --rm IMAGE_ID
dr-xr-xr-x  2 root root  4096 Apr 12 01:10 bin
drwxr-xr-x  4 root root 81920 May  2 06:37 dev
drwxr-xr-x 40 root root  4096 May  2 06:37 etc
drwxr-xr-x  2 root root  4096 Sep 23  2011 home
:
  • コマンド引数指定あり -> ENTRYPOINTのコマンドがそのまま実行される , コマンド引数が無視される
% docker run --rm IMAGE_ID ls -lh
dr-xr-xr-x  2 root root  4096 Apr 12 01:10 bin
drwxr-xr-x  4 root root 81920 May  2 06:37 dev
drwxr-xr-x 40 root root  4096 May  2 06:37 etc
drwxr-xr-x  2 root root  4096 Sep 23  2011 home
:

CMD, ENTRYPOINTで ["command", "paramN"]形式による引数付きコマンド を記述した場合の挙動

CMD 使用時

  • Dockerfile
from centos
maintainer hoge

CMD ["ls", "-l"]
  • コマンド引数指定なし => CMDで指定したコマンドを実行するだけ
% docker run --rm IMAGE_ID
dr-xr-xr-x  2 root root  4096 Apr  1  2013 bin
dr-xr-xr-x  2 root root  4096 Sep 23  2011 boot
drwxr-xr-x  5 root root  4096 May  2 01:57 dev
drwxr-xr-x 43 root root  4096 May  2 01:57 etc
drwxr-xr-x  2 root root  4096 Sep 23  2011 home
:
  • コマンド引数指定あり -> 引数で指定したコマンド(とオプション)が実行される , CMDで指定したコマンドは無視(公式document的に言うと上書き)される
% docker run --rm IMAGE_ID ls -lh
dr-xr-xr-x  2 root root 4.0K Apr 12 01:10 bin
drwxr-xr-x  4 root root  80K May  2 06:44 dev
drwxr-xr-x 40 root root 4.0K May  2 06:44 etc
drwxr-xr-x  2 root root 4.0K Sep 23  2011 home
:

ENTRYPOINT 使用時

  • Dockerfile
from centos
maintainer hoge

ENTRYPOINT ["ls", "-l"]
  • コマンド引数指定なし => CMDで指定したコマンドを実行するだけ
% docker run --rm IMAGE_ID
dr-xr-xr-x  2 root root  4096 Apr 12 01:10 bin
drwxr-xr-x  4 root root 81920 May  2 06:49 dev
drwxr-xr-x 40 root root  4096 May  2 06:49 etc
drwxr-xr-x  2 root root  4096 Sep 23  2011 home
:
  • コマンド引数指定あり -> エラーになる , ENTRYPOINTのparam部分が、コマンド引数で上書きされる
% docker run --rm IMAGE_ID ls -lh  # ENTRYPOINTのparam部分 "-l" が コマンド引数 "ls" で上書きされる
ls: cannot access ls: No such file or directory
:
  • 他のコマンドを指定してみる -> 同じくエラー
% docker run --rm IMAGE_ID ps
ls: cannot access ps: No such file or directory
:
  • paramの部分だけ上書きされるなら、lsコマンドの引数として正しい値(オプション)を指定したらどうなるか? -> オプションとして認識された
% docker run --rm IMAGE_ID -lh
dr-xr-xr-x  2 root root 4.0K Apr 12 01:10 bin
drwxr-xr-x  4 root root  80K May  2 07:57 dev
drwxr-xr-x 40 root root 4.0K May  2 07:57 etc
drwxr-xr-x  2 root root 4.0K Sep 23  2011 home
:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment