Docker部署前后端+PostgreSQL遇NetworkError资源获取错误求助
解决Docker Compose部署中前端无法与后端/数据库通信的问题
看起来你遇到的核心问题是容器网络下的服务寻址错误,以及环境变量配置不匹配导致的连接失败。咱们一步步来排查和修复:
1. 修复数据库服务的环境变量配置
你的db服务里设置了POSTGRES_HOST=localhost,这是错误的——在Docker Compose的网络中,每个服务都是独立的容器,localhost指向容器自身,而不是宿主机或其他服务。另外,PostgreSQL官方镜像的环境变量里没有POSTGRES_PASS,正确的变量名应该是POSTGRES_PASSWORD。
修改docker-compose.yml中db的环境变量:
db: restart: always environment: - POSTGRES_USER=admin - POSTGRES_PASSWORD=pass # 替换错误的POSTGRES_PASS - POSTGRES_DB=mydb # 移除POSTGRES_HOST=localhost,容器内默认监听所有地址 - POSTGRES_HOST_AUTH_METHOD=trust container_name: db image: postgres:12.0-alpine volumes: - postgres_data:/var/lib/postgresql/data/
2. 为web服务添加必要的环境变量
你的entrypoint.sh依赖DATABASE、SQL_HOST、SQL_PORT这几个环境变量,但web服务里完全没定义它们,导致脚本无法正确等待数据库启动,后端应用也没法找到数据库地址。
在docker-compose.yml的web服务中补充环境变量:
web: container_name: web build: context: . dockerfile: Dockerfile command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/usr/src/web/ ports: - 8000:8000 - 3000:3000 - 35729:35729 stdin_open: true depends_on: - db environment: - DATABASE=postgres - SQL_HOST=db # 用Docker Compose的服务名作为数据库地址(自动解析) - SQL_PORT=5432 # 同时添加后端连接数据库需要的变量(根据你的Django/Flask配置调整) - DB_NAME=mydb - DB_USER=admin - DB_PASSWORD=pass
3. 修复前端API请求的地址
前端在容器内运行时,如果请求localhost:8000,会指向前端容器自身,而不是后端的web服务。你需要做两种调整:
- 开发环境下:前端的API基础URL可以设为
http://localhost:8000(依赖宿主机的端口映射);如果前端和后端在同一个容器里,也可以直接用http://web:8000(Docker内部网络的服务名寻址)。 - 配置前端代理:比如React项目可以在
front/package.json里添加proxy字段,Vue项目在vue.config.js里配置代理,让API请求自动转发到后端服务。
举个React项目的例子,在front/package.json中添加:
"proxy": "http://web:8000"
这样前端的API请求会自动路由到后端容器,不需要在代码里写死地址。
4. 给entrypoint.sh补上网络工具
你的entrypoint.sh用了nc(netcat)检测数据库端口,但Alpine镜像默认没装这个工具,需要在Dockerfile里添加安装命令:
修改Dockerfile的依赖安装部分:
# install psycopg2 dependencies and netcat RUN apk update \ && apk add postgresql-dev gcc python3-dev musl-dev netcat-openbsd
最后验证步骤
- 清理现有容器和数据卷:
docker-compose down -v - 重新构建并启动服务:
docker-compose up -d --build - 检查web容器日志,确认数据库连接正常:
docker-compose logs web,应该能看到"PostgreSQL started"的输出 - 重新启动前端服务:
docker-compose exec web npm start --prefix ./front/ - 访问
http://localhost:3000测试通信
这样应该就能解决前端无法与后端、数据库通信的问题了。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

