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

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配置注意事项

确保你的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;
    }
}
验证步骤
  1. 重新构建镜像:docker-compose build
  2. 启动容器:docker-compose up -d
  3. 查看容器日志:docker-compose logs app,确认php-fpm和vite都已启动
  4. 访问http://localhost:8080,应该可以正常加载Laravel+React应用,且Vite HMR功能正常

内容的提问来源于stack exchange,提问作者Katya P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:32:18