xvno/blog

Docker: CMD & ENTRYPOINT

Opened this issue · 3 comments

xvno commented

CMD

CMD 有三种用法

  1. exec, PID=1;
  2. shell exec, sh 的 PID=1;
  3. params for ENTRYPOINT, CMD 作为参数列表当然是用 []。

1. exec

Mode 1, 主命令以PID=1运行,但它不能获得环境变量和用户传入的参数

build docker image from this: docker build -t cmd-exec .

FROM alpine
CMD ["top"]

run docker container docker run -d --name cmd-exec cmd-exec

Mode 2, 同样主命令PID=1, 能获得环境变量 & 用户参数

FROM alpine
CMD ["sh", "-c", "top"]

2. shell exec

FROM alpine
CMD top

相当于docker容器运行了 /bin/sh -c top, sh进程的PID=1。

3. 参数列表(指令列表), 为 ENTRYPOINT 提供默认的参数。

FROM alpine
ENTRYPOINT ["executable", "param-1", "param-2"]
CMD ["param1", "param2", "param3"]
xvno commented

ENTRYPOINT

ENTRYPOINT 指令的目的是为容器指定默认执行的任务。
它也有两种执行模式:

  1. exec,命令行参数传入生效, 并忽略 CMD 参数
  2. shell,命令行参数被忽略

1.exec

FROM alpine
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
docker run --rm entrypoint-exec -U xvno

这种情况下, 可以在 run 的时候传入参数(此时,CMD 所有参数都会失效)

2. shell

FROM alpine
ENTRYPOINT top -U root
# CMD ["-s"], 在这儿失效了, 因为 shell 模式
docker run --rm entrypoint-shell -U xvno

可验证后面的参数无效

--entrypoint 用来覆盖默认的 ENTRYPOINT

docker run --rm --entrypoint whoami entrypoint-shell
xvno commented

2018031211363722