Как предоставить возможность взаимодействия между контейнерами в докере

Здравствуйте. Такая проблема: пытаюсь развернуть проект в докере. Сервер, фронт(angular 9) и тесты. Но такая фишка, что авторизация сделана через oauth2 и никак не получается банально пройти тест на авторизацию. Никак не могу до туда достучаться. Что я пытаюсь делать:
docker-compose.yml:

version: '3.4'

services:
  client:
    image: docker_client
    build:
      context: ../../../client/UmkMainClient/
      dockerfile: ./Test.Dockerfile
    command: http-server --path dist/umk/index.html --port 4200 
    ports:
      - "4200:4200"

  docker_client-e2e:
    image: docker_client
    command: dockerize -wait tcp://client:4200 -wait http://s-auth/api/about
      -wait tcp://selenium:4444 -timeout 10s 
      -wait-retry-interval 1s bash -c "npm run e2eci"
    depends_on:
      - client
      - selenium
  selenium:
    image: selenium/standalone-chrome
    expose:
      - 4444      
  db:
    image: postgres:10.12
    restart: always
    environment:
      POSTGRES_PASSWORD: postgres

  s-auth:
    image: repos.xxx.xxx.xxx:xxxx/repository/xxx/s-auth:latest
    ports:
      - '10502:80'
    environment:
      - ASPNETCORE_ENVIRONMENT=Test
      - DEV_PG_HOST
    healthcheck:
      test: curl -sS db || echo 1
      interval: 5s
      timeout: 10s
      retries: 5

docker-compose.override.yml:

version: '3.4'

services:
  s-auth:
    image: '${DOCKER_REGISTRY-}sauth'
    build:
      context: ../../../../../auth-service/
      dockerfile: ./s-auth/Dockerfile
    volumes:
      - '../../../../../auth-service/s-auth/config:/app/config'
      - '../../../../../auth-service/s-auth/logs:/app/logs'

run:

docker-compose -f docker-compose.yml -f docker-compose.override.yml build 
docker-compose -f docker-compose.yml -f docker-compose.override.yml up --force-recreate --abort-on-container-exit

Dockerfile

FROM trion/ng-cli-e2e

ENV DOCKERIZE_VERSION v0.6.0

RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
   && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
   && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz

WORKDIR /app
COPY . .
RUN npm install
RUN npm install http-server -g
RUN node ng-add-pug-loader.js
RUN node --max-old-space-size=4096 node_modules/@angular/cli/bin/ng build --prod

terminal log:
В тесте происходит вход, ввожу логин и пароль, нажимаю кнопку. После этого собираю логи браузера и вот что там.

log: [{"level":"SEVERE","message":"http://s-auth/connect/token - Failed to load resource: the server responded with a status of 400 (Bad 
Request)","timestamp":1590079989322,"type":""},{"level":"SEVERE","message":"http://localhost:4200/vendor.js 136657:28 \"Error performing password flow\" HttpErrorResponse","timestamp":1590079989322,"type":""}]

По-моему исходя из ошибки вы туда-таки достучались. Ошибка об этом намекает.

2 лайка

Но почему тогда авторизация не прошла? Локально, у меня все проходит. Но в докере, такое ощущение, что у этого, скажем так, фантомного браузера нет доступа с localhost:4200 до s-auth, чтобы получить токен.

Попробуйте после подъема контейнера зайти в него через docker exec -ti container_name bash (или sh), и постучаться курлом/пингом в хост s-auth.

1 лайк

Так достучаться получается, но ведь это получается с контейнера клиента до контейнера с авторизацией. Я не знаю, возможно, я не прав. Но одно ли это тоже, что и достучаться с запущенного в контейнере клиента браузера до контейнера s-auth?

root@b7df9ed6aa44:/app# curl http://s-auth
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1">
 ...

Одно и тоже. Сам контейнер видит этот хост, значит и все дочерние процессы тоже.

Поэтому я и говорю, что 400 ошибка - это означает, что проблема с запросом какая-то и сервер не смог его обработать. Но это значит, что связь с сервером есть.

Если у вас есть vnc, то вы можете подключиться к браузеру и открыть прям в нём ссылку и посмотреть что будет.

2 лайка

Ну и да - раз курл работает, попробуйте точно такой же запрос, что шлёт браузер, отправить через курл.

1 лайк

Пробовал, почему-то не прошел запрос. Буду смотреть это я неправильно запрос для oauth2 составил или в чем-то еще дело.

Скорее всего что-то с запросом, раз сервер ругается на 400.

1 лайк

Возможно вам поможет программа, Fiddler, позволяет отлавливать запросы/ответы, смотреть их содержимое.

3 лайка

Спасибо

log: [{"level":"SEVERE","message":"http://s-auth/connect/token - Failed to load resource: the server responded with a status of 400 (Bad Request)","timestamp":1590079989322,"type":""},{"level":"SEVERE","message":"http://localhost:4200/vendor.js 136657:28 \"Error performing password flow\" HttpErrorResponse","timestamp":1590079989322,"type":""}]

Обычно подобные сетевые сообщения, содержащие localhost, говорят о неверной конфигурации сервисов. У вас в докерах сервисы не должны обращаться к localhost (за исключением случаев, когда они действительно скомпонованы вместе, в одном контейнере).

При этом, локально все работает, т.к. компоненты поднимаются в рамках одного хоста. В докере же вы работаете с N изолированных хостов. Зачастую, недостаточно просто в compose прописать имена сервисов. Где-то в самих сервисах могут еще зашиваться URL. Проверьте, что при сборке все эти нюансы учтены.

2 лайка

Спасибо.