当前位置: 首页 > 知识库问答 >
问题:

为什么我的docker在执行完shell脚本后会退出?[重复]

郎睿
2023-03-14

为什么我的 Docker 在执行我的 shell 脚本后退出?谢谢。

Docker版本:

docker --version
Docker version 1.12.4, build 1564f02

我的图片:

docker pull lw96/ubuntu-16.04-lnmp1.3

运行后:

docker run -it -d --name test -p 8080:80 lw96/ubuntu-16.04-lnmp1.3 sh /root/run.sh

我检查了:< code>docker ps -a

root@ubuntu:/home/liwei# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
68c0ce4c59f7        a57b0c1a60cf        "/bin/bash"         2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp   test

以下是run.sh:

#! /bin/bash
lnmp restart
echo "lnmp already start"
exit 0

我得到了日志:

root@ubuntu:/home/liwei# docker logs -f test
+-------------------------------------------+
|    Manager for LNMP, Written by Licess    |
+-------------------------------------------+
|              http://lnmp.org              |
+-------------------------------------------+
Stoping LNMP...
Stoping nginx... nginx is not running.
 * MySQL server PID file could not be found!
Gracefully shutting down php-fpm /etc/init.d/php-fpm: 82: kill: No such process

................................... failed. Use force-quit
Starting LNMP...
Starting nginx...  done
Starting MySQL
.. * 
Starting php-fpm  done
lnmp already start!

之后,我的码头集装箱出口:

root@ubuntu:/home/liwei# docker ps -a
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS                     PORTS               NAMES
cb98d7427802        lw96/ubuntu-16.04-lnmp1.3   "sh /root/run.sh"   8 minutes ago       Exited (0) 7 minutes ago                       test

但是,当我使用时:

docker pull lw96/ubuntu-16.04-lnmp1.3

docker run -it -d -p 80:80 --name test  lw96/ubuntu-16.04-lnmp1.3

docker exec -it test /bin/bash

cd ~ && ./run.sh

我的容器工作得很好。为什么?

共有1个答案

郭坚壁
2023-03-14

只要主进程正在运行,docker容器就会运行,一旦切入点/命令进程退出,它就会结束。在您的例子中,只要您到达退出0行,您的进程就完成了,docker容器应该退出。

如果你想防止这种情况,你必须保持你的进程运行。这里有很多选项,比如在前台运行进程,或者通过执行tail-f/some/log/file之类的操作来保持进程运行,其中日志来自后台运行进程。

 类似资料:
  • 问题内容: 我正在写一个如下的shell脚本: 现在,我想要实现的是列出$ ACTIONS_DIR中的每个文件以执行该文件。$ ACTIONS_DIR下的每个文件都是另一个Shell脚本。 现在,这里的问题在于,使用exec之后,脚本将停止并且不会转到下一个文件。任何想法为什么会这样? 问题答案: 替换shell进程。如果只想将该命令作为子进程调用,则将其删除。

  • 我正试图按照以下说明为Dash生成文档集:http://kapeli.com/docsets.问题是,脚本在wget之后不会继续,并且似乎不会抛出任何错误。当我把脚本复制到终端时,一切都很好。 我使用的是MacOS 10.8.4和默认的bash。 我查看了其他帖子,比如我的shell脚本在exec之后停止,但我没有在这里使用exec。 为什么脚本退出?

  • 问题内容: 从数据库表和solr中读取数据后,我编写了一个脚本来更新数据库表。我正在使用asyn.waterfall模块。问题在于,成功完成所有操作后,脚本不会退出。我使用过的数据库连接池也认为可能正在创建脚本以无限期等待。我想将此脚本放在crontab中,如果无法正确退出,它将不必要地创建大量实例。 问题答案: 我刚刚经历了这个问题。 仅仅使用的问题是我正在处理的程序正在创建句柄,但从未销毁它们

  • 问题内容: 我正在通过Jenkins构建Qt GUI应用程序。我添加了3个构建步骤: 构建测试可执行文件 运行测试可执行文件 用gcovr编制覆盖率报告 由于某种原因,用于运行测试可执行文件的shell任务在执行后会停止。即使是简单的也不运行。测试是使用Google Test编写的,并输出xUnit XML文件,这些文件将在构建后进行分析。一些测试启动了应用程序的用户界面,因此我安装了jenkin

  • 问题内容: 我希望服务器每分钟执行一次节点脚本。如果我手动执行文件(),该程序将完美执行,因此,我很确定这不是问题。但是,当我将其交给cron执行时,什么也没发生。 这是cron文件中的行。 这是一个示例日志: 可执行文件: 知道我为什么要广播静音吗?我应该在其他地方调试? 更新: 我相信问题与我的相对文件路径有关,并且main.js从其自己的目录外部执行。 所以现在,我已经放置在目录中。看起来像

  • 我有一个shell脚本,它执行sql构建工作。 当从unix提示符手动调用它时,它正在执行并按预期给出结果。 但是当它从java调用时,它并没有完全执行。 手动执行: MODIFY_PATCH_CREATION. ksh 118765CP_14052906_28112015134449_16 日志文件显示为: 但是如果我从java程序执行相同的操作,如下所示: Java代码: 当作为java Sh