容器创建后php8.0-fpm未启动 随容器自启配置方法
问题根源
你在Dockerfile的RUN指令中执行的所有service xxx start/restart命令,仅在当前构建层的临时容器内生效,镜像构建完成后这类运行时进程状态不会被持久化。容器启动时只会执行你最终定义的ENTRYPOINT/CMD中的命令——当前配置仅启动了前台运行的Apache,完全没有启动php-fpm的逻辑,因此服务不会随容器运行。
正确配置方案
首先删除Dockerfile中所有无效的构建期服务启停命令,通过自定义启动脚本同时管理php-fpm和Apache两个进程,注意容器内1号主进程必须以前台模式运行,避免容器启动后直接退出。
第一步:修正Dockerfile内容
FROM ubuntu:jammy ENV DEBIAN_FRONTEND=noninteractive # 安装Apache和PHP依赖 RUN apt-get update && \ apt-get install software-properties-common -y && \ add-apt-repository ppa:ondrej/php -y && \ apt-get update && \ apt-get install -y --no-install-recommends \ apache2 \ php8.0-fpm \ libapache2-mod-fcgid \ && apt-get clean && rm -rf /var/lib/apt/lists/* # 调整Apache目录索引配置 COPY /src/dir.conf /etc/apache2/mods-enabled/ # 部署PHP测试页 COPY /src/info.php /var/www/html/ # 配置Apache多处理模块与php-fpm代理规则 RUN a2dismod php8.0 php8.1 mpm_prefork && \ a2enmod mpm_event proxy proxy_fcgi && \ a2enconf php8.0-fpm # 拷贝启动入口脚本 COPY entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/entrypoint.sh EXPOSE 80 ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
第二步:编写启动脚本
在Dockerfile同级目录新建entrypoint.sh文件,内容如下:
#!/bin/bash # 启动php-fpm并以守护进程模式放到后台运行 php-fpm8.0 -D # 以前台模式启动Apache作为容器1号主进程,保证可以正常接收Docker信号 exec apache2ctl -D FOREGROUND
注意事项
- 原配置中安装的
libapache2-mod-php8.0、libapache2-mod-php属于mod_php模式的依赖包,切换到php-fpm模式后完全不需要,删除可以有效缩小镜像体积 - 所有服务启停操作都不要放在
RUN阶段执行,构建阶段仅需要完成软件安装、配置修改这类静态操作,运行时的进程启动全部放到入口脚本中处理 - 上述脚本是Apache+php-fpm场景下的轻量实现,如果需要更完善的进程守护、异常自动重启能力,可以替换为supervisor托管两个服务
内容的提问来源于stack exchange,提问作者Daniel Fulgido
相关产品推荐
相关产品推荐

