代码之家  ›  专栏  ›  技术社区  ›  Moak

如何获取时间表:在docker容器中运行以使用systemd?

  •  1
  • Moak  · 技术社区  · 6 年前

    下列的 this guide 我设置了两个文件

    /etc/systemd/system/lumen-cron。服务

    [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。计时器

    [Unit]
    Description=Run lumen timed tasks
    
    [Timer]
    OnBootSec=1min
    OnUnitActiveSec=1m
    
    [Install]
    WantedBy=timers.target
    

    我得到我的docker图像 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调度程序?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Community Egal    4 年前

    看起来您可能正在尝试设置 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