Docker执行install.sh脚本后PHP容器启动失败排查
问题根本原因
- 你在docker-compose中配置的
command参数会完全替换PHP镜像的默认启动命令,而非在原有服务启动前额外执行脚本。官方PHP-FPM镜像默认会在容器启动时运行PHP-FPM主进程,你配置的命令覆盖了这个逻辑,就算脚本执行完,容器也不会启动PHP服务,会直接退出。 - 安装wget时进程卡住的直接原因:apt安装部分依赖包时会弹出交互式配置提示(比如时区选择、配置项确认),你执行脚本时没有指定非交互安装模式,进程会一直阻塞等待用户输入,从外部看就像安装进程卡死无响应。
- 你之前把安装命令写在Dockerfile的
RUN指令中不生效,是因为修改Dockerfile后没有重新构建镜像,docker-compose默认会使用本地已缓存的旧版本镜像,不会自动应用你新写的构建逻辑。 - 额外逻辑误区:系统依赖安装属于镜像构建阶段的工作,不应该放在容器启动阶段执行,否则每次容器重启都会重复执行安装流程,既拖慢启动速度,也容易因为网络、交互问题导致启动失败。
修复方案
推荐方案:将依赖安装移回Dockerfile(最规范)
- 修改
./.docker/php/Dockerfile,把依赖安装逻辑写入构建步骤,同时指定apt为非交互模式:
# 替换为你实际使用的PHP-FPM基础镜像版本 FROM php:7.4-fpm # 配置apt为非交互模式,避免安装时弹框卡住 ENV DEBIAN_FRONTEND=noninteractive # 安装系统依赖 RUN apt-get update \ && apt-get install -y wget \ # 此处可追加其他你需要的系统依赖 && apt-get clean \ && rm -rf /var/lib/apt/lists/* # 保留镜像默认的ENTRYPOINT和CMD,不要手动覆盖,确保PHP-FPM正常启动
- 删掉docker-compose中php服务下的
command: /bin/bash -c "./install.sh"配置行。 - 启动服务时增加
--build参数强制重新构建PHP镜像,让Dockerfile的修改生效:
docker-compose up -d --build
临时方案:保留启动脚本执行逻辑
如果你确实需要在容器启动时执行初始化脚本,需要修改脚本,在脚本最后手动启动PHP-FPM主进程,同时配置apt非交互模式:
- 修改
./src/install.sh内容:
#!/bin/bash mkdir testdir export DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y wget # 脚本最后执行默认启动命令,拉起PHP-FPM主进程 exec docker-php-entrypoint php-fpm
- 给脚本增加可执行权限(宿主机执行):
chmod +x ./src/install.sh
- 重新启动容器即可。
内容的提问来源于stack exchange,提问作者sulman
相关产品推荐
相关产品推荐

