在容器中运行cron

时间:2019-01-24 18:30:07

标签: php docker cron

我有一个托管Symfony Web应用程序的php容器。我需要使用后台脚本并从crontab启动它们。只要我使用root用户,它就可以正常工作。但是,当我将用户切换为“ www-data”时,它将停止工作。 我的想法是,以用户www-data的身份运行php-fpm,并在我进入容器时登录“ www-data”。但是crontab可以为root用户定义,因为它允许在命令前加上用户名。

我的入口点文件包含:

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

我的docker文件如下:

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 :(得分:2)

您只需删除USER www-data中的Dockerfile行并将/entrypoint.sh文件更改为波纹管

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

添加su www-data命令后,您将用户切换到www-data,如果您登录到容器,则默认用户将是www-data

答案 1 :(得分:2)

我在这种情况下遇到的问题是,当您使用非特权用户运行容器时,由于缺乏对cron.pid文件的访问权限而无法启动cron。

因此,最好的解决方法是为cron二进制文件设置SUID,这将允许您的www-data用户使用root特权运行它。您还应该确保将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

这应该很好。