docker cmd 和 entrypoint的区别

749 阅读2分钟

docker cmd 和 entrypoint的区别

这篇文章说的很详细了 Dockerfile中CMD和ENTRYPOINT命令详解

cmd 和entrypoint 都是容器内执行的第一条命令

exec 方式启动会是进程1

shell 方式/bin/sh -c "命令" 会是进程1

单独使用时

cmd exec方式可以被docker run 传递的命令覆盖

entrypoint exec 方式可以在docker run传递的命令在entrypoint后面追加参数

shell 方式忽略传递/追加参数

同时使用时

cmd 命令可以给entrypoint追加参数,此时run 进来的参数可以覆盖cmd直接追加到entrypoint

docker 官网截图

运行测试

dockerfile

FROM centos:centos6.10

MAINTAINER Poettian <poettian@gmail.com>

COPY docker-php-entrypoint /usr/local/bin/
ENTRYPOINT ["docker-php-entrypoint"]

EXPOSE 9000

CMD ["top"]

docker-php-entrypoint

#!/bin/sh
set -e

# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
    set -- php-fpm "$@"
fi

 echo "$@"
exec "$@"

build

docker build --no-cache  -t test .

验证

同时有exec模式的cmd 和 entrypoint.预期通过cmd给entrypoint传参, run带参数时替换掉cmd中的参数

run传参

运行

docker run -it --rm test ps aux

结果:

ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  11268  1740 pts/0    Rs+  12:34   0:00 ps aux

run不传参

运行

docker run -it --rm test

结果

top - 12:39:31 up  9:58,  0 users,  load average: 0.03, 0.09, 0.07
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.6%us,  0.9%sy,  0.0%ni, 98.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8155704k total,  2037708k used,  6117996k free,   107340k buffers
Swap:  2097148k total,        0k used,  2097148k free,  1126940k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    1 root      20   0 14952 1944 1736 R  0.0  0.0   0:00.02 top

run 传 -i

运行

docker run -it --rm test -i

结果

php-fpm -i
/usr/local/bin/docker-php-entrypoint: line 10: exec: php-fpm: not found

启动容器并执行命令

运行

docker run -itd --name testcon test
docker exec testcon ps aux

结果

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  14952  1952 pts/0    Ss+  12:30   0:00 top
root        32  1.0  0.0  13384  1804 ?        Rs   12:42   0:00 ps aux

课件cmd命令确实是1号进程