Laravel+React+Vite Docker项目中npm run dev无法通过CMD正常执行
核心问题是容器主进程被替换:基础镜像php:8.2-fpm-alpine3.18默认的CMD是启动php-fpm(FastCGI进程),当你在docker-compose里设置command: npm run dev时,容器会把npm run dev作为唯一主进程运行,原来的php-fpm根本没启动。Nginx需要连接app容器的php-fpm(9000端口)处理Laravel的PHP请求,此时端口不通就返回502错误。
至于crond的情况:手动进入容器时php-fpm已经在运行,你启动crond只是新增一个后台进程,不会影响php-fpm;但如果把crond设为command,同样会替换php-fpm作为主进程,导致FastCGI服务缺失,依然502。
需要让容器同时运行php-fpm和vite dev server,可以通过两种方式实现:
方案一:用启动脚本同时管理两个进程
步骤1:创建启动脚本
在项目根目录创建start.sh文件,内容如下:
#!/bin/sh # 启动php-fpm后台运行 php-fpm & # 启动vite dev server,作为前台进程保持容器运行 npm run dev
给脚本添加执行权限:
chmod +x start.sh
步骤2:修改Dockerfile
在Dockerfile末尾添加:
# 复制启动脚本 COPY start.sh /usr/local/bin/start.sh RUN chmod +x /usr/local/bin/start.sh # 设置启动脚本为CMD CMD ["start.sh"]
步骤3:修改docker-compose.yml
删除app服务的command配置(现在由Dockerfile的CMD指定):
app: container_name: app build: context: . dockerfile: Dockerfile ports: - "5173:5173" volumes: - "data:/var/www/" networks: - local restart: on-failure
方案二:用supervisord管理多进程(更稳定)
步骤1:安装supervisord
修改Dockerfile,添加supervisord的安装:
# 安装supervisord RUN apk add --no-cache supervisor
步骤2:创建supervisord配置文件
在项目根目录创建.docker-compose/supervisord.conf,内容如下:
[supervisord] nodaemon=true [program:php-fpm] command=php-fpm stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:vite] command=npm run dev directory=/var/www stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0
步骤3:修改Dockerfile
复制配置文件并设置CMD:
# 复制supervisord配置 COPY .docker-compose/supervisord.conf /etc/supervisord.conf # 设置supervisord为启动命令 CMD ["supervisord", "-c", "/etc/supervisord.conf"]
步骤4:调整docker-compose.yml
同样删除app服务的command配置即可。
确保你的Nginx配置(.docker-compose/nginx/default.conf)正确区分Laravel的PHP请求和Vite的静态资源/HMR请求:
server { listen 80; server_name localhost; root /var/www/public; index index.php index.html; # 处理Vite HMR请求 location / { try_files $uri $uri/ @vite_proxy; } location @vite_proxy { proxy_pass http://app:5173; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # 处理PHP请求 location ~ \.php$ { fastcgi_pass app:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
- 重新构建镜像:
docker-compose build - 启动容器:
docker-compose up -d - 查看容器日志:
docker-compose logs app,确认php-fpm和vite都已启动 - 访问
http://localhost:8080,应该可以正常加载Laravel+React应用,且Vite HMR功能正常
内容的提问来源于stack exchange,提问作者Katya P

