react не может получить доступ к докеру API-compose

#reactjs #spring-boot #api #docker-compose #proxy

Вопрос:

У меня есть три контейнера: MySQL 8, Spring Boot и React, и я создал docker-compose.yml, полностью основанный на Callicoder https://github.com/callicoder/spring-security-react-ant-design-polls-app

Также попробовал версию среды разработки с запуском npm вместо сборки и без nginx, и получил ошибку nodejs api, которая была исправлена. Однако я могу пойти к почтальону и обычно использовать api в localhost:8080, так что, я думаю, это проблема связи с контейнерами 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=falseamp;serverTimezone=UTCamp;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:

 

Докер-файл(передний конец)

 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 amp;amp; 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;"]
 

пакет.json

 ...
"proxy": "http://127.0.0.1:8080",
...
 

Ответ №1:

Докер-это localhost не то же localhost самое, к чему вы пытаетесь получить доступ с помощью почтальона. Это происходит потому app-server , app-client что и mysqldb являются 3 различными контейнерами, работающими в одной сети. У каждого из них есть свое название.

Таким образом, чтобы получить доступ app-server к вашему контейнеру изнутри, вы можете использовать: http://app-server:8080

Например, взгляните на URL-адрес вашей базы данных:

 jdbc:mysql://mysqldb:3306/Olimpo?useSSL=falseamp;serverTimezone=UTCamp;useLegacyDatetimeCode=false
 

Вы можете заметить, что пытаетесь получить доступ к URL mysqldb -адресу вместо localhost по той же причине. Вы ссылаетесь на URL-адрес базы данных в качестве имени контейнера.

Вы можете взглянуть глубже здесь

Комментарии:

1. Я перешел на сервер приложений вместо локального хоста в package.json и REACT_APP_API_BASE_URL в docker-compose.yml, и все равно возникла та же проблема

2. я внес некоторые изменения, но по-прежнему работаю только с версией среды разработки: в docker-составлено изменено: файл dockerfile: Файл Dockerfile.параметры разработки: REACT_APP_API_BASE_URL: сервер приложений :8080 портов: — «3000:3000» в приложениях.свойства spring.application.name=’app-сервер :8080′ в пакете.json «прокси»: » app-сервер:8080 «, однако в рабочей версии все та же проблема