Мне нужно привязать HOST
к моему приложению React в процессе разработки, чтобы я мог использовать прокси для других сервисов в облаке. Допустим, хост - local.myapp.example.com
.
Я выполняю свои тесты e2e, запустив пару контейнеров, в том числе один, с экземпляром моего приложения React, а затем заставляя Puppeteer делать запросы к нему. До этого момента приложение было доступно через localhost
, просто открыв порт:
// docker-compose.e2e.yml
- ports:
- 8080:3000 # app is running on 3000 inside the container.
Теперь, когда я связал его с HOST
выше, я не могу получить доступ к приложению внутри контейнера. Я обновил /etc/hosts
моего ноутбука, чтобы иметь:
// /etc/hosts - laptop
0.0.0.0 local.myapp.example.com
При этом он работает, когда я запускаю приложение на своем ноутбуке, но не работает, когда я запускаю его внутри контейнера
Чего мне не хватает?
Обновление 1
Если я захожу внутрь контейнера, я могу запустить curl local.myapp.example.com:3000
, и он работает.
Из другого контейнера (с Puppeteer) я не знаю, какой URL использовать, чтобы поразить его. Перед добавлением HOST я бы просто использовал имя контейнера Docker, например http://frontend:3000
, но теперь я не знаю, так как URL не работает
Обновление 2
Вот мой docker-compose
файл. Я не упоминал об этом раньше, потому что я не хотел задавать слишком сложный вопрос, но, поскольку я размещаю docker-compose, вполне возможно, что контейнер находится за обратным прокси-сервером:
version: '3'
services:
nginx:
container_name: nginx
image: nginx
depends_on:
- frontend
- backend
volumes:
- ./frontend.conf:/etc/nginx/conf.d/frontend.conf
ports:
- "9520:8080"
frontend:
container_name: frontend
build:
context: ..
dockerfile: Dockerfile.e2e
depends_on:
- backend
backend:
container_name: backend
image: my.private.registry/user/backend:latest
// reverse proxy conf
server {
listen 8080;
location /api {
proxy_pass http://backend:3000/api;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
location / {
# proxy_pass http://frontend:3000;
proxy_pass https://frontend:3000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
Из Chrome я нажимал http://localhost:9520
. Теперь, когда мне нужно связать HOST
(а также мне нужно HTTPS=true
в моем приложении create-реагировать-приложение), мне нужно нажать http://local.myapp.example.com:9520
из Chrome (не уверен, что https нужно идти сюда?).
Из контейнера обратного прокси я могу сделать curl --insecure --header 'Host: local.myapp.example.com' https://frontend:3000
, и он разрешается.
Из Chrome я пытаюсь нажать и http
, и https
local.myapp.example.com:9520
, но это не работает.
От Почтальона, это работает, если я делаю.
Резюме
Мне нужно иметь возможность ударить https://local.myapp.example.com:9520
из Chrome (или Puppeteer) на моем ноутбуке, он должен перейти в контейнер обратного прокси на порту 8080
. Обратный прокси-сервер затем proxy_pass
отправит его в контейнер frontend
через порт 3000
.