Это Утром я обновил свою версию PHP до 7. 1, и я вижу проблему, когда cron пытается запустить php / var / www / html / artisan schedule: run
(простая команда PHP). Я вижу вывод:
3/3/2017 10:39:00 AMcrond: can't set groups: Operation not permitted
3/3/2017 10:39:00 AMcrond: USER www-data pid 1562 cmd php /var/www/html/artisan schedule:run
3/3/2017 10:40:00 AMcrond: can't set groups: Operation not permitted
3/3/2017 10:40:00 AMcrond: USER www-data pid 1563 cmd php /var/www/html/artisan schedule:run
3/3/2017 10:41:00 AMcrond: can't set groups: Operation not permitted
3/3/2017 10:41:00 AMcrond: USER www-data pid 1564 cmd php /var/www/html/artisan schedule:run
3/3/2017 10:42:00 AMcrond: can't set groups: Operation not permitted
3/3/2017 10:42:00 AMcrond: USER www-data pid 1565 cmd php /var/www/html/artisan schedule:run
3/3/2017 10:43:00 AMcrond: can't set groups: Operation not permitted
3/3/2017 10:43:00 AMcrond: USER www-data pid 1566 cmd php /var/www/html/artisan schedule:run
Выполняемая команда является Laravel команда ремесленников. Он запускается каждую минуту, позволяя выполнять другие запланированные работы в самом приложении. В этой команде нет ничего, что записывало бы какие-либо файлы или что-то в этом роде. Запланированная работа обращается к базе данных и отправляет электронное письмо. Журналы приложений отправляются на стандартный вывод, поскольку это контейнер Docker.
cron
запускается в контейнере с помощью команды crond -f -d 8
. Вот Dockerfile:
# This container should be used for any/all CLI processes
# including cron, queues, etc.
FROM php:7.1-alpine
# Copy the application files to the container
ADD . /var/www/html
WORKDIR /var/www/html
# fix permissions in CI
RUN sed -ri 's/^www-data:x:82:82:/www-data:x:1000:1000:/' /etc/passwd \
&& sed -ri 's/^www-data:x:82:/www-data:x:1000:/' /etc/group
# Install Composer dependencies
RUN apk add --update --no-cache git zip unzip \
# needed for spatie/laravel-backup
mysql-client \
# needed for gd
libpng-dev libjpeg-turbo-dev \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN docker-php-ext-install pdo_mysql gd \
# needed for forking processes in laravel queues as of Laravel 5.3
pcntl
# Ownership of the app dir for www-data
RUN chown -R www-data:www-data /var/www/html /home/www-data/
# Put php artisan schedule:run in a crontab
RUN echo "* * * * * php /var/www/html/artisan schedule:run" > /etc/crontabs/www-data
# Make sure when users get into the container they aren't root
USER www-data
Я исключил, что причиной является php artisan schedule: run
, поскольку я могу запустить его вручную, и все в порядке. Это означает, что это что-то внутри cron.
Что делает cron, что могло вызвать эту ошибку?
Из-за одного из этих двух условий в соответствии с man 2 setgroups
EPERM The calling process has insufficient privilege (the caller
does not have the CAP_SETGID capability in the user namespace
in which it resides).
EPERM (since Linux 3.19)
The use of setgroups() is denied in this user namespace. See
the description of /proc/[pid]/setgroups in
user_namespaces(7).
я представляю, что вы не используете пространства имен пользователей, и в этом случае возможность CAP_SETGID в докер-контейнере не разрешена. Вам нужно будет изменить наборы возможностей контейнеров, чтобы исправить это.
Вы используете cron, просто чтобы запустить эту команду в фоновом режиме:
RUN echo "* * * * * php /var/www/html/artisan schedule:run" > /etc/crontabs/www-data
Замена cron на sh должна позволить вам /нет/ прибегнуть к увеличению контейнерных пробок:
artisan_schedule_run:
image: your-app-image
command: /dumb-init /bin/sh -c "while true; do su www-data -c \"php /var/www/html/artisan schedule:run\" & sleep 60; done"