解決docker run 或者 docker restart 啟動(dòng)鏡像就自動(dòng)退出
執(zhí)行命令:docker run --name centos8 -d centos /bin/bash,通過(guò)docker ps查看正在運(yùn)行中容器,找不到centos8。
通過(guò)docker ps -a查看發(fā)現(xiàn),centos8容器已經(jīng)處于停止?fàn)顟B(tài)了
[root@MiWiFi-R4A-srv server]$ docker run --name centos8 -d centos /bin/basha770630ca865b3c3346a321a383f302ed22af9281be8482f4f4debc59218d0d1[root@MiWiFi-R4A-srv server]$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@MiWiFi-R4A-srv server]$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa770630ca865 centos '/bin/bash' 37 seconds ago Exited (0) 35 seconds ago centos8
為什么退出?
這是因?yàn)閐ocker后臺(tái)運(yùn)行,必須有一個(gè)前臺(tái)進(jìn)程。docker運(yùn)行的命令如果不是那些一直掛起的命令(e.g. top,ping),就是會(huì)自動(dòng)退出的。而上面的代碼中-d centos就是需要執(zhí)行的指定的命令。命令如果執(zhí)行完畢了或者應(yīng)用終結(jié)時(shí),容器會(huì)自動(dòng)停止。
解決方法
以前臺(tái)進(jìn)程的形式運(yùn)行
將運(yùn)行的程序以前臺(tái)進(jìn)程的形式運(yùn)行,如果容器需要同時(shí)啟動(dòng)多個(gè)進(jìn)程,那么也只需要將其中一個(gè)掛起到前臺(tái)即可。
比如上面所說(shuō)的 centos 容器,只需要將啟動(dòng)指令修改為交互方式啟動(dòng):
docker run --name centos8 -it centos /bin/bash
又或者是Web容器:
service php5-fpm start && nginx -g 'daemon off;'
取巧方式
添加類似于 tail top 這種可以前臺(tái)運(yùn)行的程序,持續(xù)輸出log文件即可。
service nginx start && service php5-fpm start && tail -f /var/log/nginx/error.log
再以上面所說(shuō)的 web 容器為例,可以寫(xiě)成:
service nginx start && service php5-fpm start && tail -f /var/log/nginx/error.log
自己寫(xiě)腳本
在啟動(dòng)centos/ubuntu容器時(shí),可以做一個(gè)手腳:做一個(gè)死循環(huán),持續(xù)輸出任意,這樣容器不會(huì)認(rèn)為沒(méi)事可做而自殺了。
docker run -d centos /bin/bash -c 'while true; do echo hello world; sleep 1; done'
補(bǔ)充知識(shí):docker中啟動(dòng)容器時(shí)CMD調(diào)用的sh腳本中if命令報(bào)未預(yù)期的符號(hào) if[[的解決辦法
最近通過(guò)Dockerfile編寫(xiě)鏡像,CMD中調(diào)用的是sh腳本(start.sh)進(jìn)行啟動(dòng)容器,通過(guò)docker run啟動(dòng)時(shí),啟動(dòng)不成功,進(jìn)行docker logs 容器ID,發(fā)現(xiàn)報(bào)錯(cuò)為:未預(yù)期的符號(hào) if [[
我直接在外部linux系統(tǒng)調(diào)用執(zhí)行start.sh是成功的,通過(guò)docker exec 進(jìn)入容器,在容中調(diào)用start.sh也未報(bào)錯(cuò),命令中需要啟動(dòng)的程序都成功啟動(dòng)。腳本直接執(zhí)行沒(méi)問(wèn)題,通過(guò)docker run卻報(bào)錯(cuò),百思不得其解。
start.sh中報(bào)錯(cuò)代碼段如下
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
經(jīng)過(guò)查閱比較,因?yàn)槲业膕tart.sh在報(bào)錯(cuò)語(yǔ)句之前也有if語(yǔ)句,但是沒(méi)報(bào)錯(cuò),發(fā)現(xiàn)兩處區(qū)別為第一處if使用的是單[],將代碼改為[],則成功,修改如下:
if [ -e /home/dc/testnn-aaa.zip ];then
以上這篇解決docker run 或者 docker restart 啟動(dòng)鏡像就自動(dòng)退出就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. ASP.NET MVC遍歷驗(yàn)證ModelState的錯(cuò)誤信息2. 將properties文件的配置設(shè)置為整個(gè)Web應(yīng)用的全局變量實(shí)現(xiàn)方法3. asp(vbs)Rs.Open和Conn.Execute的詳解和區(qū)別及&H0001的說(shuō)明4. jsp網(wǎng)頁(yè)實(shí)現(xiàn)貪吃蛇小游戲5. 用css截取字符的幾種方法詳解(css排版隱藏溢出文本)6. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向7. asp中response.write("中文")或者js中文亂碼問(wèn)題8. PHP設(shè)計(jì)模式中工廠模式深入詳解9. CSS hack用法案例詳解10. ThinkPHP5實(shí)現(xiàn)JWT Token認(rèn)證的過(guò)程(親測(cè)可用)
