解决docker run 或者 docker restart 启动镜像就自动退出
执行命令:dockerrun--namecentos8-dcentos/bin/bash,通过dockerps查看正在运行中容器,找不到centos8。
通过dockerps-a查看发现,centos8容器已经处于停止状态了
[root@MiWiFi-R4A-srvserver]$dockerrun--namecentos8-dcentos/bin/bash a770630ca865b3c3346a321a383f302ed22af9281be8482f4f4debc59218d0d1 [root@MiWiFi-R4A-srvserver]$dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES [root@MiWiFi-R4A-srvserver]$dockerps-a CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES a770630ca865centos"/bin/bash"37secondsagoExited(0)35secondsagocentos8
为什么退出?
这是因为docker后台运行,必须有一个前台进程。docker运行的命令如果不是那些一直挂起的命令(e.g.top,ping),就是会自动退出的。而上面的代码中-dcentos就是需要执行的指定的命令。命令如果执行完毕了或者应用终结时,容器会自动停止。
解决方法
以前台进程的形式运行
将运行的程序以前台进程的形式运行,如果容器需要同时启动多个进程,那么也只需要将其中一个挂起到前台即可。
比如上面所说的centos容器,只需要将启动指令修改为交互方式启动:
dockerrun--namecentos8-itcentos/bin/bash
又或者是Web容器:
servicephp5-fpmstart&&nginx-g"daemonoff;"
取巧方式
添加类似于tailtop这种可以前台运行的程序,持续输出log文件即可。
servicenginxstart&&servicephp5-fpmstart&&tail-f/var/log/nginx/error.log
再以上面所说的web容器为例,可以写成:
servicenginxstart&&servicephp5-fpmstart&&tail-f/var/log/nginx/error.log
自己写脚本
在启动centos/ubuntu容器时,可以做一个手脚:做一个死循环,持续输出任意,这样容器不会认为没事可做而自杀了。
dockerrun-dcentos/bin/bash-c"whiletrue;doechohelloworld;sleep1;done"
补充知识:docker中启动容器时CMD调用的sh脚本中if命令报未预期的符号if[[的解决办法
最近通过Dockerfile编写镜像,CMD中调用的是sh脚本(start.sh)进行启动容器,通过dockerrun启动时,启动不成功,进行dockerlogs容器ID,发现报错为:未预期的符号if[[
我直接在外部linux系统调用执行start.sh是成功的,通过dockerexec进入容器,在容中调用start.sh也未报错,命令中需要启动的程序都成功启动。脚本直接执行没问题,通过dockerrun却报错,百思不得其解。
start.sh中报错代码段如下
if[[-e/home/dc/testnn-aaa.zip]];then rm-rf/home/testnn-aaa unzip-q-o-d/hometestnn-aaa.zip echo"unzipzipfinished" else echo"dczipnotexist" fi
经过查阅比较,因为我的start.sh在报错语句之前也有if语句,但是没报错,发现两处区别为第一处if使用的是单[],将代码改为[],则成功,修改如下:
if[-e/home/dc/testnn-aaa.zip];then
以上这篇解决dockerrun或者dockerrestart启动镜像就自动退出就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。