Docker Alpine, Celery (рабочий и рабочий) завершаются с ошибкой PermissionError при использовании пользователя без полномочий root

Я пытаюсь запустить приложение Flask с Celery (рабочий + бит) на Docker Alpine, используя docker-compose.

Я хочу, чтобы оно работало с пользователем без полномочий root celery в моем контейнере Docker.
Приложение flask строится нормально и работает, но мои контейнеры celery не работают с этой ошибкой:

 File "/usr/lib/python3.6/site-packages/celery/platforms.py", line 543, in maybe_drop_privileges
    _setuid(uid, gid)
  File "/usr/lib/python3.6/site-packages/celery/platforms.py", line 564, in _setuid
    initgroups(uid, gid)
  File "/usr/lib/python3.6/site-packages/celery/platforms.py", line 507, in initgroups
    return os.initgroups(username, gid)
PermissionError: [Errno 1] Operation not permitted

Мой Dockerfile: я пытался добавить RUN chown celery:celery /etc/group, думая, что это проблема, но все равно не получается

FROM alpine:3.8

RUN apk update && \
    apk add build-base python3 python3-dev libffi-dev libressl-dev && \
    cd /usr/bin && \
    ln -sf python3 python && \
    ln -sf pip3 pip && \
    pip install --upgrade pip

COPY requirements.txt .
RUN pip install -r requirements.txt

RUN addgroup celery
RUN adduser celery -G celery -s /bin/sh -D

RUN mkdir -p /var/log/celery/ && chown celery:celery /var/log/celery/
RUN mkdir -p /var/run/celery/ && chown celery:celery /var/run/celery/
RUN chown celery:celery /etc/group  # added to try fixing the issue

USER celery

ENV FLASK_APP=flask_app
WORKDIR app/
COPY flask_app flask_app

Моя докер-композиция:

(...)
celeryworker:
    build: .
    command: celery -A flask_app.tasks worker --loglevel=INFO --uid=celery --pidfile=/tmp/celeryworker-shhh.pid

celerybeat:
    build: .
    command: celery -A flask_app.tasks beat --loglevel=INFO --uid=celery --pidfile=/tmp/celerybeat-shhh.pid

person smallwat3r    schedule 12.01.2020    source источник


Ответы (3)


Вы должны сделать так

RUN mkdir -p /var/log/celery/ /var/run/celery/
RUN useradd -G root celery && \
    chgrp -Rf root /var/log/celery/ /var/run/celery/ && \
    chmod -Rf g+w /var/log/celery/ /var/run/celery/c && \
    chmod g+w /etc/passwd

...
RUN chmod a+x /start.sh
USER celery
ENTRYPOINT ["/start.sh"]

Сначала вы должны создать пользователя celery. Затем добавьте этого пользователя в корень группы. После этого вам нужно установить права на запись для этой папки, вам нужно поместить логи и /etc/passwd. Вам также понадобится один скрипт для добавления вашего пользователя в /etc/passwd.

#!/bin/bash
#
if [ `id -u` -ge 10000 ]; then
    echo "celery:x:`id -u`:`id -g`:,,,:/home/web:/bin/bash" >> /etc/passwd
fi
person Kine    schedule 12.01.2020
comment
Я использую изображение Alpine, где useradd должно быть adduser. Хотя я хотел создать определенную группу и для этого пользователя. Нашел рабочее решение после некоторых исследований. Но это помогло! Ваше здоровье - person smallwat3r; 12.01.2020

Оба ответа от @Shashank V и @Kine были действительно актуальными и полезными, но впоследствии у них все еще были некоторые проблемы.

Проведя некоторое исследование, я, наконец, заставил его работать со следующей конфигурацией.

Файл Docker

FROM alpine:3.11.0

RUN apk update && \
    apk add build-base python3 python3-dev libffi-dev libressl-dev && \
    ln -sf /usr/bin/python3 /usr/bin/python && \
    ln -sf /usr/bin/pip3 usr/bin/pip && \
    pip install --upgrade pip

RUN mkdir -p /var/log/celery/ /var/run/celery/
RUN addgroup app && \
    adduser --disabled-password --gecos "" --ingroup app --no-create-home app && \
    chown app:app /var/run/celery/ && \
    chown app:app /var/log/celery/

USER app

ENV PATH="/home/app/.local/bin:${PATH}"
WORKDIR app/

COPY requirements.txt .
RUN pip install --user -r requirements.txt\

COPY flask_app flask_app

ENV FLASK_APP=flask_app

докер-компоновка

 (...)
 celeryworker:
   build: .
   command: >
     celery -A shhh.tasks worker
     --loglevel=INFO
     --logfile=/var/log/celery/celeryworker-shhh.log
     --pidfile=/var/run/celery/celeryworker-shhh.pid

 celerybeat:
   build: .
   command: >
     celery -A shhh.tasks beat
     --loglevel=INFO
     --logfile=/var/log/celery/celerybeat-shhh.log
     --pidfile=/var/run/celery/celerybeat-shhh.pid
     --schedule=/var/run/celery/celerybeat-schedule  # specify schedule db in a loc where app has read/write access
person smallwat3r    schedule 12.01.2020
comment
Ваш подход выглядит хорошо, но может ли кто-нибудь объяснить, я запускаю службу создания докеров сельдерея от пользователя без полномочий root в Ubuntu, но в любом случае он использует пользователя root в контейнере, он работал без сбоев в течение 3 месяцев, .... все внезапно при обновлении изображения он дает мне предупреждение о запуске от имени пользователя без полномочий root, а контейнер продолжает перезапускаться.... - person ronit; 04.06.2020

Вы должны быть пользователем root, если хотите использовать аргумент --uid или --gid. Попробуйте удалить эти аргументы.

person Shashank V    schedule 12.01.2020
comment
Ура, это действительно имеет смысл, поскольку команда выполняется из созданного контейнера с текущим пользователем. Кроме того, у меня все еще были некоторые проблемы с доступом к базе данных планировщика ударов. Нашел решение после некоторых исследований. Но это очень помогло! - person smallwat3r; 12.01.2020