如何在Docker容器中运行脚本且不退出,同时维持PHP-FPM服务
解决方案:同时启动CUPS服务与PHP-FPM
核心思路是通过自定义启动脚本先启动CUPS后台服务,再让PHP-FPM作为容器的前台主进程运行,既保证容器持续存活,又能正常提供API服务。
1. 编写正确的启动脚本 startup.sh
#!/bin/sh # 后台启动CUPS服务 cupsd & # 用exec替换当前shell进程为PHP-FPM,使其成为容器PID 1(保证容器能正确响应停止信号) exec php-fpm
2. 修改Dockerfile
基于你原有的PHP 8.1.12-fpm镜像,添加CUPS安装、脚本复制与权限配置:
FROM php:8.1.12-fpm # 安装cups和cups-pdf依赖 RUN apt-get update && \ apt-get install -y --no-install-recommends cups cups-pdf && \ rm -rf /var/lib/apt/lists/* # 复制启动脚本到容器内并赋予可执行权限 COPY startup.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/startup.sh # 设置容器启动命令为自定义脚本(替代原镜像的php-fpm CMD) CMD ["startup.sh"]
3. 关键细节解释
cupsd &:将CUPS服务后台运行,避免占用前台进程导致容器无法启动PHP-FPM。exec php-fpm:用exec让PHP-FPM替换当前脚本进程,成为容器的主进程(PID 1),这样Docker能通过它管理容器生命周期(比如停止时发送正确的终止信号)。- 脚本必须添加可执行权限:
chmod +x是必不可少的步骤,否则容器启动时会提示权限不足。
4. Docker Compose配置示例(参考)
如果你的docker-compose.yml需要调整,可参考以下结构:
version: '3.8' services: php-api: build: . ports: - "9000:9000" # PHP-FPM默认端口,根据你的反向代理(如Nginx)配置调整 volumes: - ./your-api-code:/var/www/html # 挂载你的API代码目录 # 若需外部访问CUPS管理端口,可添加以下映射(按需开启) # ports: # - "631:631"
5. 问题排查要点
- 验证CUPS是否启动:进入容器执行
ps aux | grep cupsd,确认存在CUPS进程。 - 查看CUPS日志:如果CUPS启动失败,可查看
/var/log/cups/error_log定位问题(比如配置权限、监听地址错误)。 - 确保脚本shebang正确:用
#!/bin/sh而非#!/bin/bash,避免部分轻量基础镜像(如Alpine)不兼容bash的问题。
内容的提问来源于stack exchange,提问作者MrCujo
相关产品推荐
相关产品推荐

