1.覆盖
在写Dockerfile时, ENTRYPOINT或者CMD命令会自动覆盖之前的ENTRYPOINT或者CMD命令.
1)覆盖默认的CMD
如下,覆盖命令为/bin/bash
docker run demo /bin/bash
和CMD类似, 默认的ENTRYPOINT在docker run时也可以被覆盖.
2)覆盖默认的ENTRYPOINT
docker run --entrypoint demo
区别在于:CMD的默认程序比ENTRYPOINT更容易被覆盖
2.用法
1)CMD
FROM centos
CMD["ps","aux"]
docker run centos:CMDtest
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 4.0 0.0 41812 1520 ? Rs 12:19 0:00 /usr/bin/ps aux
如果改变参数命令为:-elf
docker run centos:CMDtest -elf
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"-elf\": executable file not found in $PATH": unknown.
必须CMD完全覆盖
docker run centos:CMDtest ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 R root 1 0 0 80 0 - 10453 - 12:20 ? 00:00:00 ps -elf
2)ENTRYPOINT
FROM centos
ENTRYPOINT ["ps"]
CMD ["aux"]
docker run centos:CMDtest
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 41812 1516 ? Rs 12:27 0:00 ps aux
如果改变参数命令为:-elf
docker run centos:CMDtest -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 R root 1 0 1 80 0 - 10453 - 12:28 ? 00:00:00 ps -elf
当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令,换句话说实际执行时,将变为:
<ENTRYPOINT> "<CMD>"
ENTRYPOINT指定默认的运行命令, CMD指定默认的运行参数
因为ENTRYPOINT和CMD同时存在时, docker会把CMD的命令拼接到ENTRYPOINT命令之后
参考:https://zhuanlan.zhihu.com/p/30555962