Docker随笔记—docker run执行后,容器的状态是Exited的一些困惑

问题:运行docker run -itd -p 5000:5000 --name localregistry registry:2.5 /bin/bash命令后,发现容器并无跑起来,而是变成了Exited状态。若是将末尾的/bin/bash去掉,容器就能正常的start了python

解决:
翻看很多docker资料, 到目前为止,对致使此问题的出现算是有了一个比较清晰的认识。
1.容器的生命周期。要把docer容器看作是一个单独的进程及运行环境。容器不等价于一个虚拟的操做系统。Docker的开发人员也一直主张doder容器应该只运行一个进程。例如,一个web server服务就是一个进程。docker run命令就是为了运行一个进程。当一个进程结束了,那么docker容器也就结束了。web

2.根据问题中描述的现象,两条命令的差异就在与末尾是否添加了/bin/bash这条command。暂且先停住。咱们回过头来看docker image是怎么生成的。docker

3.Dockerfile文件。Dockerfile文件中有两个关键字CMDENTRYPOINT。其中CMD的值是能够被覆盖的。举个栗子:
假设Dockerfile中的内容包含了:bash

FROM python
CMD ["/home/hello.sh","Hello World"]   
ENTRYPOINT ["/home/hello.sh","xiaoming"]

那么根据CMD可被覆盖的特征来看,若是在docker run后增长了/bin/bash。那么,在镜像run的时候,执行的CMD就变成了/bin/bash。通常镜像文件中两种关键字选用其中之一就能够了。但也能够同时使用。同时使用的时候,CMD中的值会被看成ENTRYPOINT的参数。因此,ENTRYPOINT的内容就变成["/home/hello.sh","/bin/bash"]spa

4.咱们再来看我要启动的registry镜像中都包含了哪些CMD和ENTRYPOINT。以下图:
图片描述操作系统

根据上图中的前两行可知,容器运行后默认执行的是/entrypoint.sh脚本,脚本命令的参数是/etc/docker/regis...。因此,若是咱们本身在run的时候添加了新的command,那么镜像内置的执行命令就没法正确执行了,因而容器就Exited了。code

最后,准备附上参考资料连接。但因为此文章是跨天写的,有些资料找不到了。你们上网查查CMD与ENTRYPOINT区别的资料的就明白了。server

相关文章
相关标签/搜索