我试图在容器启动并运行后运行以下命令。
php artisan queue:work -n -q &
"
然而,这完全破坏了我的容器启动。
CMD ["php", "artisan", "queue:work", "-n", "-q", "&"]
我应该如何以Docker的方式来做这件事?
编辑:
使用docker-comact我添加了这一行到我的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队列:工作。
如果你需要优雅的关机排队,你可以遵循这个。
这篇文章摘自@Paul Redmond在Laravel News上的文章,并扩展了他的docker入口点文件,以满足我的需要。经过大量的关机测试,我终于能够做到了。
docker创作的第一件事。为您的队列服务设置yml文件停止信号:SIGTERM
。
queue:
image: laravel-www
container_name: laravel-queue
stop_signal: SIGTERM
depends_on:
- app
volumes:
- .:/var/www/html
...
在entrypoint.sh文件中,接下来的主要内容是运行队列:使用exec
命令工作。
#!/usr/bin/env bash
set -e
# Run our defined exec if args empty
if [ -z "$1" ]; then
role=${CONTAINER_ROLE:-app}
env=${APP_ENV:-production}
if [ "$env" != "local" ]; then
echo "Caching configuration..."
(cd /var/www/html && php artisan cache:clear && php artisan config:clear && php artisan route:clear && php artisan view:clear)
(cd /var/www/html && php artisan config:cache && php artisan event:cache && php artisan route:cache && php artisan view:cache)
fi
if [ "$role" = "app" ]; then
echo "Running PHP-FPM..."
exec php-fpm
elif [ "$role" = "queue" ]; then
echo "Running the queue..."
exec php /var/www/html/artisan queue:work -vv --no-interaction --tries=3 --sleep=5 --timeout=300 --delay=10
elif [ "$role" = "cron" ]; then
echo "Running the cron..."
while [ true ]
do
exec php /var/www/html/artisan schedule:run -vv --no-interaction
sleep 60
done
else
echo "Could not match the container role \"$role\""
exit 1
fi
else
exec "$@"
fi
你的完了。下次停止队列服务时,它将优雅地停止,不会等待10秒的SIGKILL。我认为这与PID 1有关。
不能在后台运行队列,否则容器将停止,因为命令已有效完成。删除
但是,如果您想在后台运行队列,并且仍然能够附加到容器并访问外壳,您可以将
尾巴-f /dev/null
作为最终命令来保持容器运行。
队列: work命令在前台运行,所以您应该这样运行它,这样容器就不会立即退出。
由于Laravel中的应用程序代码与作为web应用程序、队列或调度程序运行容器的代码相同,因此我构建了一个可以在这些上下文中使用的映像。我使用带有环境变量的bash start脚本来定义容器角色,这是我为队列工作器容器运行的:
#!/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
还要注意的是,无限的同时循环和睡眠组合来保持调度器角色运行和运行调度:在后台运行命令,以防调度器运行重叠(因为它们需要每分钟运行一次,不管最后一次是否完成)。
rabbitMQ 工作队列 轮询分发 >[danger] 简单队列是一对一的关系,一个生成者对应一个消费者,实际开发中,一般消费者是以业务相结合的,需要时间去处理业务,如果只有一个消费者,那么生产者就会积压很多消息,消费不出去 代码演示: 'use strict'; const Controller = require('egg').Controller; /** * 队列一对多演示 * 生产
工作队列接口 结构体 struct rt_workqueue 工作队列控制块 更多... struct rt_work 工作回调函数信息 更多... 函数 struct rt_workqueue * rt_workqueue_create (const char *name, rt_uint16_t stack_size, rt_uint8_t priority) 创
我不明白Laravel和Laravel 我可以看到: 队列:收听给定队列 工作:处理队列上的下一个作业 但是仍然没有得到它,因为我已经尝试了两者,如果有任何新的队列,两者都将运行队列(工作选项不只是运行一次) 我不是在说守护进程选项。就这两个。
我有一个奇怪的问题Laravel队列:工作。在我的crontab中,我设置了一个工作,就像Laravel文档中描述的那样 在我的应用程序/控制台/Kernel.php我设置这个: 在我的正式服php工匠队列中:工作运行几秒钟,然后被“杀死”。这就是我所期望的。 在我的开发盒php artisan队列中:工作永远运行。因此,激活cron作业会产生php进程,直到整个内存被填满。 两个盒子都是Cent
我正在使用带有beanstalkd的Laravel4.1在后台运行一些密集的Photoshop PSD文件处理。我还安装了phpBeanstalkdAdmin来监视队列中发生的事情。 正在处理的作业大约需要7-10分钟,但我注意到我的一些作业会重新启动,即使它们仍在忙于运行。 留意phpBeanstalkadmin,我可以看到工作被埋葬时排队:听拿起工作,但过了一会儿,它被踢了回来,准备好了。 要
问题内容: 我有一个作业,使用另一个作业的参数触发了该作业。每次给工作分配不同的参数- 运行哪个修订版。 我不想允许同一作业的并发运行,但是我想在该作业的队列中允许多个挂起的构建。 从我尝试过的方法来看,它无效,无论队列中触发了多少个构建,我都只能在队列中看到一个待完成的构建。 任何插件都有可能吗? 问题答案: 如果Jenkins已经包含具有相同param值的构建,则不会将其放置在队列中。 为此,