CMD 与 ENTRYPOINT
CMD 与 ENTRYPOINT 都是为了让容器工作得像可执行文件一样,接受参数,产生特定的输出存在的—容器命令化工具。如果没有这些工具,那么docker run -it abc:v0.0.1 /bin/bash
的最后一个参数就会变成启动命令。如果有CMD,它的命令也会被 docker run 结尾的参数命令锁覆盖,原本的命令不会作为 startup command 执行;如果有 ENTRYPOINT,docker run 结尾的参数命令会作为 ENTRYPOINT 的命令执行; CMD 还可以为 ENTRYPOINT 提供参数。
比较奇怪的地方是,如果使用了非 /bin/bash 的 startup command,docker run 的时候就不能 /bin/bash 进去了。
一个容器最好只有一个 CMD,一个 ENTRYPOINT。子容器的 CMD 会覆盖父容器的 CMD。
CMD 可以为 ENTRYPOINT 提供参数。
他们都有 exec 和 SHELL 两种工作模式。
例如以下的例子,可以用 docker run -it d8c80106de01
tty 接管上去:
1 |
|
因为最后一个命令使用了 /bin/bash
所以容器最终成为了一个 bash 命令。
如果使用 sshd 的话,还可以 ssh 进去。在启动容器的时候直接打开端口映射docker run -it -p 52022:22 d8c80106de01
,然后在内部打开 sshd /usr/sbin/sshd
(不知道为什么是直接写ENTRYPOINT /usr/sbin/sshd
不能正常工作),在本地直接用端口去 ssh 即可ssh -p 52022 root@localhost
。如果容器内部没有打开 sshd,则需要 exec
(低版本使用attach
)进去了。