繁体   English   中英

反应无法访问 API docker-compose

[英]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-serverapp-clientmysqldb是在同一网络中运行的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM