Docker: CMD & ENTRYPOINT
Opened this issue · 3 comments
xvno commented
xvno commented
CMD
CMD 有三种用法
- exec, PID=1;
- shell exec, sh 的 PID=1;
- 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 指令的目的是为容器指定默认执行的任务。
它也有两种执行模式:
- exec,命令行参数传入生效, 并忽略 CMD 参数
- 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