t.me/atinfo_chat Telegram группа по автоматизации тестирования

Connection refused при nginx, docker-compose с одним и тем же network

docker
configuration
nginx
selenoid
infrastructure
Теги: #<Tag:0x00007f9e3c864688> #<Tag:0x00007f9e3c8644a8> #<Tag:0x00007f9e3c8641d8> #<Tag:0x00007f9e3c864228> #<Tag:0x00007f9e3c864fc0>

(Arina) #1

День добрый

Проблема заключается в том, что при запуске тестов в CI по урлу отдает connection refused
url - http://server-two:8080/

version: '3'

services:
  nginx:
    image: nginx:latest
    volumes:
      - ../../nginx.conf:/etc/nginx/nginx.conf
    network_mode: bridge
    restart: always
    ports:
      - 8080:80
    links:
      - server-one
      - server-two

  server-one:
    image: bla-bla:latest
    ports:
      - 9999:9999
    network_mode: bridge

  server-two:
    build:
      context: ../../.
      dockerfile: Dockerfile
    network_mode: bridge
    ports:
      - 80:8080
    links:
      - server-one

  selenoid:
    image: aerokube/selenoid:latest
    network_mode: bridge
    command: -limit 2 -retry-count 1000
    ports:
      - 4444:4444
    volumes:
      - ./config:/etc/selenoid:ro
      - /var/run/docker.sock:/var/run/docker.sock
    links:
      - server-one
      - server-two

  selenoid-ui:
    network_mode: bridge
    image: aerokube/selenoid-ui:latest
    command: -selenoid-uri 'http://selenoid:4444'
    ports:
      - 8081:8080
    links:
      - selenoid

Сам nginx конфиг выглядит вот так

events { }
http {
  sendfile on;

  upstream server-one {
      server server-one:9999;
  }

  upstream frontend {
      server server-two:80;
  }

  server {
      listen 80;
          
      location /api {
          proxy_pass         http://server-one;
      }

      location / {
          proxy_pass         http://frontend;
      }
  }
}

И сам докерфайл

FROM node:8-alpine as build
WORKDIR /src
COPY . /src
RUN npm ci
RUN npm run build

FROM nginx:alpine
COPY --from=build /src/dist /usr/share/nginx/html

где build - это запуск server-two с настройками

По локалхост:8080 все работает.
Что тут не так?


#2

А можете расписать чуть подробнее? Где у вас тесты, это все, nginx с сервисами и тесты в одной докер сети? И локалхост, который работает, это откуда вы пробова зайти и где запускали сервисы, локально или из контейнера nginx’a?
P.S. я не очень понимаю в настройках конфига nginx, но разве вы не должны переходить на http://frontend который переадресует на server-two?


(Arina) #3

nginx находится в главной директории рядом src проекта как и dockerfile
сами тесты лежат от него в двух папках
все это в одной сети засчет network_mode: bridge у всего, что находится в docker-compose

это откуда вы пробова зайти - это все при запуске локально через докер, который собирает образ сервиса засчет nginx конфига

p.s. разве вы не должны переходить на http://frontend так пробовала и не работает
стучусь на service-two, который смотрит если это бэкэнд /api - то перенаправлять на моки, иначе - на фронтэнд
моки на 9999 порту, фронт 8080


#4

Возможно ваша система (в докере) не понимает, что вы обращаетесь к nginx по домену server-two. Вамо или надо настроить конфиг nginx добавив в блок server server_name указав там нужное доменое имя, или поправить /etc/hosts добавив там server-two localhost
Я не уверен в обоих вариантах, так как с nginx очень мало опыта


(Arina) #5

увы не спасло ни то, ни другое, поговорю с разработчиками и напишу, что в итоге помогло


(Arina) #6

В общем, все это выглядит вот так и стучусь в итоге на http://local-nginx:80/
В basetest надо было указать именно String[] app = {"local-nginx:local-nginx"};

version: "3"
services:
  local-nginx:
    image: nginx:latest
    container_name: local-nginx
    volumes:
      - ../../nginx.conf:/etc/nginx/nginx.conf
    network_mode: bridge
    restart: always
    ports:
      - 8080:80
    links:
      - server-mock
      - server

  server-mock:
    image: 
    container_name: server-mock
    network_mode: bridge

  server:
    image: 
    container_name: server
    network_mode: bridge
    links:
      - server-mock

  selenoid:
    image: aerokube/selenoid:latest
    network_mode: bridge
    command: -limit 2 -retry-count 1000
    ports:
      - 4444:4444
    volumes:
      - ./config:/etc/selenoid:ro
      - /var/run/docker.sock:/var/run/docker.sock
    links:
      - local-nginx

  selenoid-ui:
    network_mode: bridge
    image: aerokube/selenoid-ui:latest
    command: -selenoid-uri 'http://selenoid:4444'
    ports:
      - 8081:8080
    links:
      - selenoid

и сам nginx

events { }
http {
  sendfile on;

  upstream server-mock {
      server server-mock:9999;
  }

  upstream frontend {
      server server:80;
  }

  server {
      listen 80;
        location /api {
          proxy_pass         http://server-mock;
      }

      location / {
          proxy_pass         http://frontend;
      }
  }
}