Heroku部署XAMPP因Root权限要求无法启动的解决求助
在Heroku部署XAMPP Docker镜像时遇到Root权限问题及崩溃问题的解决方法
问题描述
我将以下Dockerfile推送至Heroku后,启动XAMPP时提示需要Root权限,进程直接退出:
FROM ubuntu:bionic ENV DEBIAN_FRONTEND noninteractive RUN apt-get update --fix-missing && \ apt-get upgrade -y && \ apt-get -y install iputils-ping && \ apt-get -y install net-tools && \ apt-get clean COPY xampp-linux-x64-8.1.0-0-installer.run /opt/xampp-linux-x64-8.1.0-0-installer.run RUN chmod +x /opt/xampp-linux-x64-8.1.0-0-installer.run && \ bash -c ./opt/xampp-linux-x64-8.1.0-0-installer.run && \ sed -i.bak s'/Require local/Require all granted/g' /opt/lampp/etc/extra/httpd-xampp.conf && \ sed -i.bak s'/Listen 80/Listen ${PORT}/g' /opt/lampp/etc/httpd.conf && \ # Enable error display in php sed -i.bak s'/display_errors=Off/display_errors=On/g' /opt/lampp/etc/php.ini && \ sed -i.bak s'/post_max_size=40M/post_max_size=100M/g' /opt/lampp/etc/php.ini CMD ["./opt/lampp/lampp", "start"]
启动错误日志:
2023-06-22T10:52:47.278663+00:00 heroku[web.1]: Starting process with command `./opt/lampp/lampp start` 2023-06-22T10:52:48.271574+00:00 heroku[web.1]: Process exited with status 2 2023-06-22T10:52:48.142173+00:00 app[web.1]: Starting XAMPP for Linux 8.1.0-0... 2023-06-22T10:52:48.147100+00:00 app[web.1]: You need to be root to perform this action.
尝试设置XAMPP开机自启并移除CMD后,Heroku启动/bin/bash直接崩溃:
2023-06-22T12:52:54.454322+00:00 heroku[web.1]: Starting process with command `/bin/bash` 2023-06-22T12:52:55.315574+00:00 heroku[web.1]: Process exited with status 0 2023-06-22T12:52:55.349266+00:00 heroku[web.1]: State changed from starting to crashed
解决方案
方案1:修改XAMPP配置,使其无需Root权限启动
Heroku容器默认以非root用户运行,我们需要调整XAMPP的脚本和权限,让它能在非root环境下工作:
移除
lampp脚本的Root权限检查
在Dockerfile中添加以下RUN命令,注释掉脚本中的root判断:RUN sed -i.bak '/You need to be root to perform this action./d' /opt/lampp/lampp && \ sed -i.bak 's/if [ $(id -u) != 0 ]; then/if false; then/' /opt/lampp/lampp修改XAMPP目录的权限
让非root用户能读写XAMPP的相关文件和目录:RUN chown -R nobody:nogroup /opt/lampp && \ chmod -R 755 /opt/lampp替换CMD为前台启动命令
直接启动Apache和MySQL,并保持前台进程运行(Heroku要求容器必须有持续运行的前台进程):CMD ["/bin/sh", "-c", "/opt/lampp/bin/apachectl start && /opt/lampp/bin/mysqld_safe --user=nobody & tail -f /opt/lampp/logs/error_log"]
方案2:让Heroku容器以Root用户运行(Beta功能)
Heroku提供了beta功能允许容器以root运行,通过设置环境变量实现:
heroku config:set HEROKU_RUN_AS_ROOT=1 -a 你的应用名称
设置完成后重新部署镜像,lampp start就能以root权限执行。注意这个功能是beta版,可能存在稳定性风险。
关于移除CMD后崩溃的说明
Heroku要求容器必须保持一个前台运行的进程,如果你移除CMD,默认启动的/bin/bash在无终端环境下会直接退出,导致容器被标记为崩溃。必须通过前台命令(比如tail -f日志、直接前台启动服务)来维持进程运行。
内容的提问来源于stack exchange,提问作者Phönix 64
相关产品推荐
相关产品推荐

