我有一个托管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
但是它也不起作用。 任何帮助将不胜感激:)
答案 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
这应该很好。