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号进程