crond: não é possível definir grupos: operação não permitida

1

Esta manhã eu atualizei minha versão do PHP para 7.1 e estou vendo um problema quando o cron tenta executar php /var/www/html/artisan schedule:run (um comando PHP simples) Eu vejo a saída:

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

O comando que está sendo executado é um comando do Laravel artisan. Ele é executado a cada minuto, permitindo que outros trabalhos agendados sejam concluídos dentro do próprio aplicativo. Não há nada neste comando que escreve em qualquer arquivo ou algo assim. O trabalho agendado fala com um banco de dados e envia alguns e-mails. Os logs do aplicativo são enviados para o stdout, pois é um contêiner do Docker.

cron é executado em um contêiner com o comando crond -f -d 8 . Aqui está o 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

Eu descartei que php artisan schedule:run é a causa, já que posso executá-lo manualmente e está tudo bem. Isso significa que é algo dentro do cron.

O que o cron está fazendo sob as capas que podem causar esse erro?

    
por Webnet 03.03.2017 / 13:31

2 respostas

2

É por causa de uma dessas duas condições de acordo com 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).

Eu imagino que você não esteja usando namespaces de usuário. Nesse caso, o recurso CAP_SETGID não é permitido no contêiner docker. Você precisará alterar os conjuntos de recursos dos contêineres para corrigi-lo.

    
por 07.03.2017 / 23:16
0

Você está executando o cron apenas para que este comando seja executado em segundo plano:

RUN echo "*       *       *       *       *       php /var/www/html/artisan schedule:run" > /etc/crontabs/www-data

Substituir cron com sh deve permitir / não / aumentar o número de contêineres:

  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"
    
por 08.03.2017 / 01:19