当前位置: 首页 > 知识库问答 >
问题:

Docker Laravel队列:工作

葛嘉悦
2023-03-14

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

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队列:工作。

共有3个答案

包子航
2023-03-14
匿名用户

如果你需要优雅的关机排队,你可以遵循这个。

这篇文章摘自@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有关。

陈扬
2023-03-14

不能在后台运行队列,否则容器将停止,因为命令已有效完成。删除

但是,如果您想在后台运行队列,并且仍然能够附加到容器并访问外壳,您可以将尾巴-f /dev/null作为最终命令来保持容器运行。

佟高澹
2023-03-14

队列: 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值的构建,则不会将其放置在队列中。 为此,