Докеризация приложения django вместе с тестированием cucumber

Вот в чем дело. У меня есть простое приложение django с тестами cucumber. Я докеризировал приложение django и оно прекрасно работает, но я хочу докеризировать и тесты cucumber и запустить их. Вот мой проект sturcutre:

-cucumber_drf_tests
   -feature
   -step_definitions
   axiosinst.js
   config.js
   package.json
   cucumber.js
   Dockerfile
   package-lock.json
-project_apps  
-common
docker-compose.yaml
Dockerfile
manage.py
requirements.txt

Вот мой файл cucumber_drf_tests/Dockerfile

FROM node:12

WORKDIR /app/src

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 8000

CMD ["yarn", "cucumber-drf"] (this is how I run my test locally)

Мой второй Dockerfile

FROM python:3.8

ENV PYTHONUNBUFFERED=1

RUN mkdir -p /app/src

WORKDIR /app/src

COPY requirements.txt /app/src

RUN pip install -r requirements.txt

COPY . /app/src

И мой файл docker-compose

version: "3.8"
services:
  test:
    build: ./cucumber_drf_tests
    image: cucumber_test
    container_name: cucumber_container
    ports:
      - 8000:8000
    depends_on:
      - app
  app:
    build: .
    image: app:django
    container_name: django_rest_container
    ports:
      - 8000:8000
    volumes:
    - .:/django #describes a folder that resides on our OS within the container
    command: >
      bash -c "python manage.py migrate
      && python manage.py loaddata ./project_apps/fixtures/dummy_data.json
      && python manage.py runserver 0.0.0.0:8000"
    depends_on:
      - db
  db:
    image: postgres
    container_name: postgres_db
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=bla
      - POSTGRES_PASSWORD=blaa

Если я удалю службу тестирования и запущу тесты локально, все будет нормально, но в противном случае я получаю различные ошибки, последняя из которых:

Bind for 0.0.0.0:8000 failed: port is already allocated

Эту логику я знаю, но как сказать test_container, чтобы он делал вызовы API на адрес запущенного django_rest_container. Возможно, это глупый вопрос, но я новичок в мире контейнеров, поэтому любой обмен хорошей практикой приветствуется

Проблема заключается в открытии портов. Вы выставляете и приложение, и тест на один и тот же порт (8000). Для контейнера вы можете оставить его тем же. Но для хоста он должен быть другим.

<host port> : <container port> 

Вот как порты отображаются в docker. Поэтому либо измените порт хоста в приложении, либо протестируйте другой порт, как показано ниже.

Для приложения используйте следующие порты:

7500:8000

Теперь ваше приложение будет доступно на порту 7500 и тестироваться на 8000

Вернуться на верх