#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 «, однако в рабочей версии все та же проблема