我有安装和配置软件的 docker 容器。
没有任何程序应该一直启动/运行。
我想要什么 - 它能够根据外部事件启动一些命令。喜欢:
docker exec mysupercont /path/to/mycommand -bla -for
和
docker exec mysupercont /path/to/myothercommand
但是当容器停止时“exec”是不可能的,而且这个容器里面有一些“工作”数据,用于该命令,所以我不能使用
docker run ...
每次,因为它从图像重新创建容器并销毁我的数据。
保持此类容器运行的“正确”和“最佳”方式是什么?我可以在里面启动哪个命令?
你不需要每次都执行
docker run
。docker run
实际上是两个命令的序列:“create”和“start”。运行容器时,必须指定“
-it
”:例子:
工作完成后在启动时指定的命令(在我的示例 bash 中)。例如,您执行“退出”。集装箱停靠点:
现在你可以重新开始
容器启动并再次执行命令“bash”。
使用命令连接到此会话“bash”
总结一下
run
:你要了解容器和start
容器的区别。此外,请查看“运行”参数“ ”和“ ”的作用的文档
-i t
-d
由于您提到了周期性任务,并且您可能因为您想要使用的方式而使用诸如 cron 之类的东西
docker exec
,所以我为您准备了药物。至少我最终做了这样的事情。Dockerfile
照常运行
docker run -d ....
(我用过docker-compose
)设置主机 crontab,例如:
我发现这个解决方案很好,因为我们可以在相当默认的 linux 环境中依赖古老且经过验证的 crontab,而 Docker 可以处理您的业务逻辑更奇特的 deps 和环境变量。如果您的定期任务卡住并出现内存泄漏或其他问题,您还可以设置一些限制。
Tail 时不时仍会引起一些文件操作。
永远的睡眠,没有任何副作用
这个怎么运作
是否可以启动停止的容器的整个事务取决于容器最初是如何创建的,即运行。如果您运行了一个结束的命令,或者您退出了一个交互式命令,例如 bash,您将无法启动、重新启动或执行已停止的容器。你所能做的就是删除它。是垃圾。
但是 taranaki 的最后一条评论,使用 '-itd',似乎是 docker 所要求的。
容器保持运行,你可以执行任何你想要的,你可以停止、启动或重新启动容器。当然,这只是基于高山影像的初步发现。请注意,如果您附加到容器,它会在您退出时停止,但您可以重新启动它。
docker stop $containername
我自己在这里使用了所有建议的解决方案,但是当它想要关闭容器时(例如),它们都不处理来自 Docker 守护进程的 SIGTERM 信号。所以我提出以下建议:
它基本上是一个简短的 shell 脚本,它首先拦截(“陷阱”)SIGTERM 信号,然后在无限循环中休眠一秒钟。
我主要将它与 docker-compose 和ofelia一起使用来提供 side-car 容器来备份另一个容器中的一些其他服务(例如 MariaDB 数据库)。