Docker + Laravel 队列:工作

Bor*_*nte 12 laravel docker lumen

我正在尝试在容器启动并运行后运行以下命令。

php artisan queue:work -n -q &
Run Code Online (Sandbox Code Playgroud)

"&" 之所以存在是因为守护程序选项已被弃用,后来从 Laravel 中删除。

但是,这完全破坏了我的容器启动。

CMD ["php", "artisan", "queue:work", "-n", "-q", "&"]
Run Code Online (Sandbox Code Playgroud)

我应该如何以 Docker 的方式做到这一点?

编辑:

使用 docker-compose 我将此行添加到我的 docker-compose.yml 文件中

command: bash -c 'php artisan queue:work -n -q;'
Run Code Online (Sandbox Code Playgroud)

容器已启动但未提供任何请求:S

使用这个:

command: bash -c 'php artisan queue:work -n -q &; echo "runs"; tail -f /dev/null'
Run Code Online (Sandbox Code Playgroud)

容器启动后停止

最终解决方案

所以最后我想也许负责交付应用程序的服务器不应该是运行队列的服务器。

因此,我启动了同一个 docker 镜像的另一个实例,其唯一目的是运行 artisan queue:work。

Pau*_*ond 15

queue:work 命令在前台运行,因此您应该以这种方式运行它,以便容器不会立即退出。

由于 Laravel 中的应用程序代码与作为 Web 应用程序、队列或调度程序运行容器的应用程序代码相同,因此我构建了一个可以在这些上下文中使用的图像。我使用带有环境变量的 bash 启动脚本来定义容器角色,这就是我为队列工作容器运行的内容:

#!/bin/bash

# Defaults to an app server
role=${CONTAINER_ROLE:-app}

if [ "$role" = "queue" ]; then
    # Run queue
    php artisan queue:work --verbose --tries=3 --timeout=90
elif [ "$role" = "app" ]; then
    # Run the web application
    /usr/bin/caddy --agree=true --conf=/etc/Caddyfile
elif [ "$role" = "scheduler" ]; then
    while [ true ]
    do
      php artisan schedule:run --verbose --no-interaction &
      sleep 60
    done
else
    echo "Could not match the container role...."
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

还要注意无限 while 循环和 sleep 组合以保持调度程序角色运行并在后台运行 schedule:run 命令,以防调度程序运行重叠(因为它们需要每分钟运行一次,无论最后一个是否完成)。


小智 4

您无法在后台运行队列,否则容器将停止,因为命令已有效完成。删除它&,它会保持活力。

但是,tail -f /dev/null如果您想在后台运行队列并且仍然能够附加到容器并访问 shell,则可以执行类似于最终命令的操作来保持容器运行。