Docker Alpine, Celery (рабочий и бит) завершаются с PermissionError при использовании не-1001 * пользователя - PullRequest
1 голос
/ 12 января 2020

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

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

 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

Мой docker -составить:

(...)
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

Ответы [ 3 ]

2 голосов
/ 12 января 2020

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

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"]

Вы должны создать первый пользовательский сельдерей. Затем добавьте этого пользователя в группу root. После этого вам нужно установить разрешение на запись для этой папки, вам нужно поместить логи и / 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
2 голосов
/ 12 января 2020

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

1 голос
/ 12 января 2020

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

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

Dockerfile

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

docker -композит

 (...)
 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
...