laravel的docker容器上的cron不工作

laravel的docker容器上的cron不工作,laravel,docker,cron,Laravel,Docker,Cron,我有一个容器,用于我的laravel应用程序,php:7.0.4-fpm作为基本映像 这是我的dockerfile: FROM php:7.0.4-fpm RUN apt-get update && apt-get install -y cron nano libmcrypt-dev \ mysql-client libmagickwand-dev --no-install-recommends \ && pecl install imagick

我有一个容器,用于我的laravel应用程序,php:7.0.4-fpm作为基本映像

这是我的dockerfile:

FROM php:7.0.4-fpm

RUN apt-get update && apt-get install -y cron nano libmcrypt-dev \
    mysql-client libmagickwand-dev --no-install-recommends \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    && docker-php-ext-install mcrypt pdo_mysql

COPY . /var/www

ADD crontab /etc/cron.d/laravel-cron

RUN chmod 0644 /etc/cron.d/laravel-cron

RUN touch /var/log/cron.log

RUN /usr/bin/crontab /etc/cron.d/laravel-cron

RUN cron
  • Cron没有运行,我必须在容器中使用ssh来启动它
  • 当我手动启动它时,它适用于一些简单的事情,比如每分钟回显一条文本。但不适用于php artisan schedule:run命令。在日志中,我看到:

    正在运行计划命令:'/usr/local/bin/php''artisan' 错误:插入>'/dev/null'2>&1

  • 错误:insert是我任务的名称,但网站中没有更新内容

  • 这很奇怪,因为当我手动运行php artisan schedule:run命令时,它会在网站上运行
  • 所以我的问题是:如何让cron在docker容器上工作,以执行php artisan schedule:run命令?最好在dockerfile中编写,而不是通过ssh手动编写

    我还从容器中收到一条奇怪的消息:

    ALERT: oops, unknown child (5094) exited with code 1.
    Please open a   bug report (https://bugs.php.net).
    

    虽然这是一个迟来的答复,但我认为我的解决方案可能会帮助其他人,因为我以前遇到过这个问题

    我创建了单独的docker容器作为Laravel docker Cron,用于执行Laravel计划

    这是我的Dockerfile代码

    FROM ubuntu:latest
    MAINTAINER docker@ekito.fr
    
    ENV DEBIAN_FRONTEND=noninteractive
    
    # install base packages
    RUN apt-get update && apt-get -y install cron\
    
        apt-utils \
        curl \
    
        # Install php 7.2
        php7.2 \
        php7.2-cli \
        php7.2-json \
        php7.2-curl \
        php7.2-fpm \
        php7.2-dev \
        php7.2-gd \
        php7.2-ldap \
        php7.2-mbstring \
        php7.2-bcmath \
        php7.2-mysql \
        php7.2-soap \
        php7.2-sqlite3 \
        php7.2-xml \
        php7.2-zip \
        php7.2-intl \
        libldap2-dev \
        libaio1 \
        libaio-dev
    
    # Install tools
    RUN apt-get -y install openssl \
        nano \
        ghostscript \
        iputils-ping \
        locales \
        rlwrap \
        php-pear \
        make \
        unzip \
        zip \
        tar \
        ca-certificates \
        && apt-get clean &&\
    
    # Install composer
    RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
    
    # Set locales
    RUN locale-gen en_US.UTF-8 en_GB.UTF-8 de_DE.UTF-8 es_ES.UTF-8 fr_FR.UTF-8 it_IT.UTF-8 km_KH sv_SE.UTF-8 fi_FI.UTF-8
    
    # Copy crontab file to the cron.d directory
    COPY crontab /etc/cron.d/crontab
    
    # Give execution rights on the cron job
    RUN chmod 0644 /etc/cron.d/crontab
    
    # Apply cron job
    RUN crontab /etc/cron.d/crontab
    
    # Create the log file to be able to run tail
    RUN touch /var/log/cron.log
    
    # Run the command on container startup
    CMD cron && tail -f /var/log/cron.log
    
    crontab文件将包含

    * * * * * cd /var/www && php artisan schedule:run >> /var/log/cron.log 2>&1
    # An empty line is required at the end of this file for a valid cron file.
    

    下面是此代码的repo

    另一种解决方案可以是通过运行
    php artisan schedule:run
    和supervisor。在我的例子中,我在[project root]/.docker/php/workers中有一个schedule-run.conf:

    [program:schedule-run]
    process_name=%(program_name)s_%(process_num)02d
    command=/bin/bash -c "while [ true ]; do (php /var/www/html/artisan 
    schedule:run --verbose --no-interaction &); sleep 60; done"
    autostart=true
    autorestart=true
    user=root
    numprocs=1
    redirect_stderr=true
    stdout_logfile=/var/www/html/storage/logs/schedule.log
    stopwaitsecs=60
    
    • 将您的
      apt get install-y cron
      替换为
      apt get install-y主管
    • add.docker/php/workers/etc/supervisor/conf.d
      CMD[“/usr/bin/supervisord”]
      添加到Dockerfile中

    您必须手动启动它,因为
    cron
    必须在运行时执行,因此它应该位于
    入口点
    而不是
    运行
    。然而,对于第二部分,我也有同样的经历,但是对于退出代码0,您是否设法解决了它?我用另一种方法解决了它。我用一个容器和主管做所有事情。