Запуск cron в контейнере - PullRequest
       2

Запуск cron в контейнере

0 голосов
/ 24 января 2019

У меня есть php-контейнер, в котором размещается веб-приложение Symfony. Мне нужно использовать фоновые скрипты и запускать их из crontab. И, кажется, работает, пока я использую пользователя root. Однако когда я переключаю пользователя на «www-данные» - он перестает работать. Моя идея состояла в том, чтобы запустить php-fpm как пользовательские www-данные, а также войти в «www-data» при входе в контейнер. Но crontab можно определить для пользователя root, поскольку он позволяет добавлять команды к имени пользователя.

мой файл точки входа содержит:

#!/bin/bash
npm install
cron &
php-fpm

и мой файл докера выглядит так:

WORKDIR /app

ADD ./entrypoint.sh /entrypoint.sh
RUN chmod 777 /entrypoint.sh

ADD ./crontab.txt /etc/cron.d/hello-cron
RUN chmod 0666 /etc/cron.d/hello-cron
RUN crontab /etc/cron.d/hello-cron
RUN touch /var/log/cron.log

RUN usermod -s /bin/bash www-data

USER www-data
ENTRYPOINT /entrypoint.sh

Выше работает, если я пропущу строку

USER www-data

Но я бы хотел сначала запустить cron (для пользователя root), а затем переключить пользователя контейнера по умолчанию на www-data ... поэтому я попробовал также:

ENTRYPOINT /entrypoint.sh
USER www-data

Но это не так хорошо работает. Любая помощь будет оценена :)

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Проблема, с которой я столкнулся в таком сценарии, заключается в том, что при запуске контейнера с использованием непривилегированного пользователя невозможно запустить cron из-за отсутствия доступа к файлу cron.pid.

Следовательно, лучший обходной путь - установить SUID для двоичного файла cron, который позволит запускать его с привилегиями root с использованием вашего пользователя www-data.Вы также должны убедиться, что добавили настройки cron в crontab правильного пользователя.

Вы можете изменить свой Dockerfile следующим образом:

WORKDIR /app

ADD ./entrypoint.sh /entrypoint.sh
RUN chmod 777 /entrypoint.sh

ADD ./crontab.txt /etc/cron.d/hello-cron
RUN crontab -u www-data /etc/cron.d/hello-cron  # <---- setting crontab for user www-data
RUN chmod u+s /usr/sbin/cron  # <---- setting setuid
RUN touch /var/log/cron.log

RUN usermod -s /bin/bash www-data

USER www-data
ENTRYPOINT /entrypoint.sh

Это должно работать просто отлично.

0 голосов
/ 24 января 2019

Вы можете просто удалить USER www-data строку в Dockerfile и изменить /entrypoint.sh файл как показано ниже

#!/bin/bash
npm install
cron
su www-data
php-fpm

После добавления команды su www-data вы переключаете пользователя на www-data, и если вы входите в контейнер, ваш пользователь по умолчанию будет www-data

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...