You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 23:19:51