【问题标题】:Docker Compose Start Worker After Reboot?Docker Compose 重启后启动 Worker?
【发布时间】:2023-09-24 22:45:02
【问题描述】:

我使用 docker compose 在基于 web 的 laravel 中管理 docker 镜像。这是我的 docker-compose.yml:

version: "3"
services:
  api:
    image: nginx:latest
    ports:
      - "5556:80"
    volumes:
        - .:/usr/api/
        - ./site.conf:/etc/nginx/conf.d/site.conf
        - /usr/api/vendor
    links:
        - app
    restart: unless-stopped
  app:
    build:
      context: .
      dockerfile: php.dockerfile
    tty: true
    volumes:
        - .:/usr/api/
        - /usr/api/vendor
        - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    restart: unless-stopped

我上面的配置会在服务器重启时自动运行 docker。我的问题是如何在服务器重新启动时自动运行工作作业。现在,我使用命令 docker-compose exec app php artisan queue:work 手动运行 worker。谢谢

【问题讨论】:

    标签: laravel docker docker-compose


    【解决方案1】:

    您可以使用 supervisor 来自动启动/重启服务。在此处查看 Laravel 文档:

    https://laravel.com/docs/5.5/queues#supervisor-configuration

    我使用 supervisor 来管理 Horizo​​n queue worker。

    Example config from the docs:

    [program:horizon]
    process_name=%(program_name)s
    command=php /home/forge/app.com/artisan horizon
    autostart=true
    autorestart=true
    user=forge
    redirect_stderr=true
    stdout_logfile=/home/forge/app.com/horizon.log
    

    或者,如果您使用的是 Linux,您可以单独使用 systemd 或类似的进程管理器。

    Run supervisor on startup

    Manage Docker as non root user

    pm2 is another popular process manager

    【讨论】:

    • 所以在supervisor config中,我只是调用docker-compose exec app php artisan ?,目前我需要sudo来执行docker-compose,如何处理su账户的密码?
    • 首先,您应该创建一个 docker 组(如果它不存在)并将您的用户添加到该组中。我尽量不要在 docker 中使用 root(或 sudo)。其次,你是正确的,因为你将命令 docker-compose exec app php artisan 添加到配置中。您可以以 root 身份运行supervisor,这样就不需要密码了。
    【解决方案2】:

    您需要在入口点脚本中集成php artisan queue:work 命令。

    参考 - https://docs.docker.com/config/containers/multi-service_container/

    【讨论】:

    • 是的,我已在 docker-compose.yml 的入口点配置中添加。但不知何故,它与 nginx 的链接被破坏了。 @btl using supervisor 的回答解决了这个问题。