我正在尝试在容器启动并运行后运行以下命令。
php artisan queue:work -n -q &
"&"之所以存在是因为守护程序选项已被弃用,后来从 Laravel 中删除。
但是,这完全破坏了我的容器启动。
CMD ["php", "artisan", "queue:work", "-n", "-q", "&"]
我应该如何以 Docker 的方式做到这一点?
编辑:
使用 docker-compose 我将此行添加到我的 docker-compose.yml 文件中
command: bash -c 'php artisan queue:work -n -q;'
容器已启动但未提供任何请求:S
使用这个:
command: bash -c 'php artisan queue:work -n -q &; echo "runs"; tail -f /dev/null'
容器启动后停止
最终解决方案
所以最后我想也许负责交付应用程序的服务器不应该是运行队列的服务器。
因此,我启动了同一个 docker 镜像的另一个实例,其唯一目的是运行 artisan queue:work。
最佳答案
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
还要注意无限 while 循环和 sleep 组合以保持调度程序角色运行并在后台运行 schedule:run 命令,以防调度程序运行重叠(因为无论最后一个是否完成,它们都需要每分钟运行一次)。
关于laravel - Docker + Laravel 队列 :work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48884802/