基于circleci/php:7.3-cli-node-browsers构建Docker镜像启动退出问题排查
基础镜像不匹配问题
你选择的circleci/php:7.3-cli-node-browsers是PHP CLI版本的镜像,默认没有内置、也没有预装Apache服务。你在Dockerfile中复制了Apache vhost配置,但没有添加Apache的安装指令,无法启动Web服务作为常驻进程,容器执行完入口脚本后就会自动退出。如果需要使用Apache运行Laravel,要么在apt安装步骤中新增apache2相关安装包,要么直接更换为php:7.3-apache这类带Apache运行环境的基础镜像,再额外安装node、浏览器等你需要的依赖。入口脚本无常驻进程问题
你自定义了docker-entrypoint.sh作为容器入口,需要确保脚本最后执行的是前台驻留的进程,不能是后台启动的服务。比如启动Apache要使用apache2-foreground命令,用PHP内置服务的话要执行php artisan serve --host 0.0.0.0 --port 80,不能加&放到后台运行,否则脚本执行完成后容器会直接退出。依赖服务连通失败问题
你的项目依赖Redis服务,首先要确认docker-compose.yml中已经配置了Redis服务容器,其次Laravel的.env配置中Redis的host要填写docker-compose中Redis服务的服务名,不能写127.0.0.1,否则服务启动时连不上Redis会直接报错退出。你可以执行docker logs <容器ID/容器名>命令查看容器启动日志,快速定位具体报错原因。挂载目录权限覆盖问题
如果你的docker-compose.yml中配置了本地项目目录挂载到容器内的/var/www/html路径,容器启动时本地目录的权限会覆盖Dockerfile中设置的777权限,导致Laravel无法写入storage、bootstrap/cache目录,启动报错后退出。这种情况需要在入口脚本开头额外添加一次权限设置指令,或者调整本地目录的权限配置。
内容的提问来源于stack exchange,提问作者Juan Diaz

