关于一类docker容器闪退问题定位

背景:正在学习docker期间,接到一个任务,经过docker部署一个应用A。该应用A相似于以前部署的应用B,结果很天然地犯了形而上学的错误。docker

 

思路:基于dockerfile+docker-compose.yml来部署。bash

基本操做:编写dockerfile,制做基础镜像;docker-compose.yml做端口映射,数据卷挂载等操做。less

出现问题:docker-compose up时,建立容器。docker ps看到容器的状态为restart状态,而不是正常的up。学习

难点:容器外部docker logs没能查看到容器应用运行的任何日志信息。同时因容器不断处于restart态,没法进入容器内查看应用运行的任何日志信息。区块链

定位:测试

一、怀疑是docker-compose.yml中设置的内存太少,把内存大小限制设置为4G,没能决定问题。排除内存不够缘由。spa

二、检查docker-compose.yml端口映射,确保没有与现有应用端口冲突。排除端口问题。rest

三、检查docker-compose.yml中数据卷的挂载及CMD的命令执行参数。排除数据挂载及命令参数问题。日志

四、怀疑是应用的执行权限问题,但是在不做修改状况下,docker容器中默认用的就是root权限。排除权限问题生命周期

五、本地非docker容器内运行该应用,一切正常。排除程序自身问题。

六、容器中先后台进程的影响,A是前台,B后台。(最终元凶)

出现问题缘由:dockerfile中的CMD命令,是容器启动后运行的第一条命令,其PID为1。而Docker容器仅在它的1号进程运行时,会保持运行。若是1号进程退出了,Docker容器也就退出了。而咱们要部署的应用属于后台进程,容器运行时,pid为1的进程不是A,而是bash,这个bash执行完指令后就挂了。同时由于容器中设置的restart策略为unless-stopped,所以会看到容器一直处于restart态。做为验证,将本来在容器中运行正常的B应用,在其CMD的执行参数中加上&,会看到B容器应用也一直处于restart态。

解决:在运行A应用后增长&&tail -f XXX.log,至此容器运行正常,进入A容器内进行相关区块链测试符合预期。

结论:容器生命周期和其内部PID为1的进程一致。

相关文章
相关标签/搜索