看起来您可能正在尝试设置
systemd
Docker容器内的单位。虽然可以使用
系统D
在容器内部,这不是一种非常常见的设置。
如果您查看
systemctl list-timers
在上面,您会注意到
Failed to connect to bus: No such file or directory
. 您可能会遇到此错误,因为您试图使用
systemctl
在容器内
系统D
未运行。
那么,为什么systemd没有在容器中运行呢?默认情况下,容器以多种方式与主机隔离。它们有自己的内核名称空间,包括自己的PID 1。因此,默认情况下,您的容器将无法使用主机的
系统D
插座
为了使用
系统D
在容器中,您需要运行
系统D
作为容器的PID 1。这意味着您有两个
系统D
,一个在主机上,一个在容器中。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
:
如果只想在单个容器中运行所有内容,可以使用
主管
作为容器中的PID 1,并让它运行PHP/Web服务器和
crond
。