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

Docker容器中前后端交互出现CORS错误求助

Vue前端+Express后端Docker部署的CORS问题解决

问题根源

  • 浏览器发起跨域请求时,不识别Docker内部服务域名api:5000:浏览器请求从本地机器发起,不在Docker内部网络中,无法解析api服务名;同时URL缺少http://协议前缀,直接触发CORS政策拦截。
  • 前端容器内curl能正常请求是因为容器处于Docker网络中,Docker DNS可解析api服务,和浏览器的请求环境完全不同。

解决方案

1. 修正前端环境变量配置

修改docker-compose.yml中frontend服务的VITE_API_URL,替换为宿主机可直接访问的地址:

frontend:
  image: rafaelbackx.azurecr.io/resto-frontend
  restart: always
  depends_on:
    - api
  environment:
    # 换成宿主机地址,浏览器可直接访问映射的5000端口
    VITE_API_URL: http://localhost:5000
    port: 3000
  ports:
    - "3000:3000"

2. 修复entrypoint.sh的变量替换逻辑

当前脚本给URL添加了多余单引号,会导致生成的请求URL带引号(如'http://localhost:5000'),属于无效格式。修改entrypoint.sh:

#!/bin/sh

ROOT_DIR=./dist
ls $ROOT_DIR
# 移除多余的单引号包裹
URL="$VITE_API_URL"
echo $URL
echo "Replacing env constants in JS"
for file in $(find $ROOT_DIR -type f -name \*.js);
do
  echo "Processing $file ...";
  sed -i "s|VITE_API_URL|$URL|g" $file
done
http-server -p $port dist/

3. 加固后端CORS配置(可选)

虽然默认app.use(cors())允许所有origin,但若需更严谨,可明确指定允许的前端origin:

// 替换原有的app.use(cors())
app.use(cors({
  origin: 'http://localhost:3000',
  credentials: true // 若需携带Cookie等凭证则开启
}))

验证步骤

  1. 重启所有容器:docker-compose down && docker-compose up -d
  2. 打开浏览器访问http://localhost:3000发起请求,CORS错误应消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:33:51