Докеризация приложения 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