解决dockerrun或者dockerrestart启动镜像就⾃动退出执⾏命令:docker run --name centos8 -d centos /bin/bash,通过docker ps查看正在运⾏中容器,不到centos8。
通过docker ps -a查看发现,centos8容器已经处于停⽌状态了
[root@MiWiFi-R4A-srv server]$ docker run --name centos8 -d centos /bin/bash
a770630ca865b3c3346a321a383f302ed22af9281be8482f4f4debc59218d0d1
[root@MiWiFi-R4A-srv server]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@MiWiFi-R4A-srv server]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a770630ca865 centos "/bin/bash" 37 seconds ago Exited (0) 35 seconds ago centos8
为什么退出?
这是因为docker后台运⾏,必须有⼀个前台进程。docker运⾏的命令如果不是那些⼀直挂起的命令(e.g. top,ping),就是会⾃动退出的。⽽上⾯的代码中-d centos就是需要执⾏的指定的命令。命令如果执⾏完毕了或者应⽤终结时,容器会⾃动停⽌。
解决⽅法
以前台进程的形式运⾏
将运⾏的程序以前台进程的形式运⾏,如果容器需要同时启动多个进程,那么也只需要将其中⼀个挂起到前台即可。
⽐如上⾯所说的 centos 容器,只需要将启动指令修改为交互⽅式启动:
docker run --name centos8 -it centos /bin/bash
⼜或者是Web容器:
service php5-fpm start && nginx -g "daemon off;"
取巧⽅式
添加类似于 tail top 这种可以前台运⾏的程序,持续输出log⽂件即可。
service nginx start && service php5-fpm start && tail -f /var/log/nginx/error.log
再以上⾯所说的 web 容器为例,可以写成:
service nginx start && service php5-fpm start && tail -f /var/log/nginx/error.log
⾃⼰写脚本
在启动centos/ubuntu容器时,可以做⼀个⼿脚:做⼀个死循环,持续输出任意,这样容器不会认为没事可做⽽⾃杀了。
docker run -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done"
补充知识:docker中启动容器时CMD调⽤的sh脚本中if命令报未预期的符号 if[[的解决办法
最近通过Dockerfile编写镜像,CMD中调⽤的是sh脚本(start.sh)进⾏启动容器,通过docker run启动时,启动不成功,进⾏docker logs 容器ID,发现报错为:未预期的符号 if [[
我直接在外部linux系统调⽤执⾏start.sh是成功的,通过docker exec 进⼊容器,在容中调⽤start.sh也
未报错,命令中需要启动的程序都成功启动。脚本直接执⾏没问题,通过docker run却报错,百思不得其解。
start.sh中报错代码段如下
if [[ -e /home/dc/testnn-aaa.zip ]];then
rm -rf /home/testnn-aaa
unzip -q -o -d /home testnn-aaa.zip
echo "unzip zip finished"
else
echo "dc zip not exist"
fi
经过查阅⽐较,因为我的start.sh在报错语句之前也有if语句,但是没报错,发现两处区别为第⼀处if使⽤的是单[],将代码改为
[],则成功,修改如下:
if [ -e /home/dc/testnn-aaa.zip ];then
docker进入容器以上这篇解决docker run 或者 docker restart 启动镜像就⾃动退出就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论