[英]react can't access API docker-compose
我有三个容器:MySQL 8、Spring Boot 和 React,并制作了 docker-compose.yml,完全基于 Callicoder https://github.com/callicoder/spring-security-react-ant-design-polls-app
还尝试了 npm 启动而不是构建的开发环境版本,没有 nginx,并得到了 nodejs api 错误 ECONNREFUSED。 但是我可以 go 到 postman 并在 localhost:8080 中正常使用 api,所以我猜这是一个 docker 容器通信问题,但不知道如何解决它
docker-compose.yml
version: "3.8"
services:
app-server:
build:
context: olimpoback
dockerfile: Dockerfile
ports:
- "8080:8080"
restart: always # "no" always unless-stopped
depends_on:
- mysqldb
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb:3306/Olimpo?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
SPRING_DATASOURCE_USERNAME: admin
SPRING_DATASOURCE_PASSWORD: senha
networks:
- backend
- frontend
#volumes:
# – /data/spring-boot-app
# Frontend Service
app-client:
build:
context: olimpoFront
dockerfile: Dockerfile.prod
args:
REACT_APP_API_BASE_URL: http://localhost:8080/
ports:
- "80:80"
restart: always
depends_on:
- app-server
networks:
- frontend
mysqldb:
image: mysql:8.0.21
container_name: mysqlDB
command: --default-authentication-plugin=mysql_native_password
ports:
- "3306:3306"
restart: always
environment:
- MYSQL_DATABASE=Olimpo
- MYSQL_USER=admin
- MYSQL_PASSWORD=senha
- MYSQL_ROOT_PASSWORD=senha
volumes:
- mysql_data:/var/lib/mysql
- ./mysql-dump:/docker-entrypoint-initdb.d
networks:
- backend
volumes:
mysql_data:
driver: local
networks:
backend:
frontend:
DockerFile(前端)
FROM node:14.15.1 as build
WORKDIR /app
EXPOSE 3000
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json package-lock.json ./
RUN npm install --silent && npm install react-scripts@3.3.0 -g --silent
COPY . ./
ARG REACT_APP_API_BASE_URL
ENV REACT_APP_API_BASE_URL=${REACT_APP_API_BASE_URL}
RUN npm run build
FROM nginx:1.20.1
WORKDIR /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf
COPY --from=build /app/build /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]
package.json
...
"proxy": "http://127.0.0.1:8080",
...
Docker 的localhost
localhost
您尝试使用 Postman 访问的本地主机不同。发生这种情况是因为app-server
、 app-client
和mysqldb
是在同一网络中运行的 3 个不同容器。 他们每个人都有自己的名字。
因此,要从容器内部访问您的app-server
,您可以使用: http://app-server:8080
例如,查看您的数据库 url:
jdbc:mysql://mysqldb:3306/Olimpo?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
您可能会注意到,出于同样的原因,您正在尝试访问 url mysqldb
而不是localhost
。 您指的是数据库 url 作为容器名称。
你可以在这里更深入地了解
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.