gpt4 book ai didi

docker - 如何获取schedule:run以在docker容器中与systemd一起使用?

转载 作者:行者123 更新时间:2023-12-02 19:32:57 26 4
gpt4 key购买 nike

this guide之后,我设置了两个文件

/etc/systemd/system/lumen-cron.service

[Unit]
Description=Run lumen cron tasks
After=network.target

[Service]
User=root
ExecStart=/usr/bin/php /var/www/web/artisan schedule:run

/etc/systemd/system/lumen-cron.timer
[Unit]
Description=Run lumen timed tasks

[Timer]
OnBootSec=1min
OnUnitActiveSec=1m

[Install]
WantedBy=timers.target

我得到了我的docker image FROM ubuntu:xenial并且我的启动脚本已经 systemctl enable lumen-cron
如果我登录到容器,则调度程序未运行。
$ journalctl -f -u lumen-cron.timer
No journal files were found.

$ journalctl -f -u lumen-cron.service
No journal files were found.

$ systemctl list-timers
Failed to connect to bus: No such file or directory

我撞墙了,感觉好像要接近了。有没有其他人成功通过docker容器中的systemd运行laravel / lumen调度程序?

最佳答案

看来您可能正在尝试在Docker容器内设置systemd单元。尽管可以在容器内使用systemd,但这不是很常见的设置。
如果您查看上面的systemctl list-timers的输出,您会注意到它因Failed to connect to bus: No such file or directory而出错。您可能会收到此错误,因为您尝试在未运行systemctl的容器内使用systemd
那么,为什么systemd不在容器中运行?默认情况下,容器通过多种方式与主机隔离。它们具有自己的内核 namespace ,包括自己的PID1。因此,默认情况下,您的容器将无法使用主机的systemd套接字。
为了在容器中使用systemd,您需要运行systemd作为容器的PID1。这意味着您有systemd的两个实例,一个在主机上,一个在容器中。 RedHat有一些blog posts涵盖了如何使用Fedora图像实现此目的,但是,您会注意到,它需要一些特殊的护理,并且可能会因您所需的功能而被过度杀伤。
相反,以下一些选项可能会有所帮助:
使用主机的systemd:
这可能是最简单的解决方案。您可以将这些单元文件放在主机中,然后更改ExecStart=行,以便使用相同的命令启动新容器:

[Unit]
Description=Run lumen cron tasks
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/docker run --rm -name lumen-cron yourdockerimage /usr/bin/php /var/www/web/artisan schedule:run
使用容器编排平台:
如果您有时间/资源来管理集群,则使用 Kubernetes这样的平台将是理想的选择,特别是如果您以后想要将其扩展到多个服务器上时,尤其如此。
Kubernetes的最新版本增加了对 CronJob对象的支持,使您可以指定定期运行的容器:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: lumen-cron
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: lumen-cron
image: yourimage
args:
- /usr/bin/php
- /var/www/web/artisan
- schedule:run
restartPolicy: OnFailure
使用 supervisord:
如果只想在单个容器中运行所有内容,则可以在容器中使用 supervisord作为PID 1,并使其同时运行PHP / webserver和 crond

关于docker - 如何获取schedule:run以在docker容器中与systemd一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49331943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com