Создать контейнер для PyTest в Docker

Введение

В этой статье вы можете изучить пример создания простейшего контейнера с установленным pytest а также простого контейнера на основе Ubuntu с предустановленным фреймворком PyTest

Для лучшего понимания происходящего нужно владеть основами Docker , Docker Compose , Dockerfile , Ubuntu , Python requirements

Структура проекта

Создадим простую структру следующего оригинального вида:

docker/ ├── docker-compose.yml ├── dockerfiles │ ├── Dockerfile.pytest │ └── requirements.pytest.txt └── src └── README.md

mkdir docker docker/dockerfiles docker/src touch docker/docker-compose.yml docker/src/README.md docker/dockerfiles/Dockerfile.pytest docker/dockerfiles/requirements.pytest.txt

Python контейнер

Возьмём за основу официальный контейнер Python - в этом случае не нужно отдельно устанавливать Python.

Отредактируем файлы с настройками Docker:

Dockerfile и docker-compose.yml

И файл с требования к пакетам Python requirements.pytest.txt с помощью редактора vim или любого другого редактора на ваш выбор.

vi dockerfiles/Dockerfile

# Dockerfile.pytest FROM python:3.13.0rc2-bullseye LABEL maintainer="www.devhops.site" # install dependencies COPY requirements.pytest.txt . RUN python -m pip install -r requirements.pytest.txt ENV PYTHONPATH="/opt:$PATH"

vi docker-compose.yml

Если контейнеров будет несколько - будет автоматически создана сеть в которой обращаться к контейнерам можно будет по их именам.

# docker-compose.yml services: pytest: container_name: pytest_container image: pytest_image build: context: ./dockerfiles dockerfile: Dockerfile.pytest args: buildversion: 1 ports: - "3000:3000" volumes: - ./src:/opt tty: true command: tail -F /dev/null

Если по какой-то причине нужно явно указать сеть и адрес в ней, то файл будет несколько длиннее

# docker-compose.yml services: pytest: container_name: pytest_container image: pytest_image build: context: ./dockerfiles dockerfile: Dockerfile.pytest args: buildversion: 1 ports: - "3000:3000" networks: net1: ipv4_address: 10.5.0.2 volumes: - ./src:/opt tty: true command: tail -F /dev/null networks: net1: driver: bridge ipam: config: - subnet: 10.5.0.0/16 gateway: 10.5.0.1

vi requirements.pytest.txt

# requirements.pytest.txt pytest==8.3.3 requests==2.32.3

Когда все файлы готовы нужно запустить docker compose

docker compose up -d

docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c69b88ea3ae1 pytest_image "tail -F /dev/null" About a minute ago Up About a minute 0.0.0.0:3000->3000/tcp pytest_container

Теперь можно зайти в контейнер с помощью команды exec

docker exec -it pytest_ubuntu bash

# python -m pytest -V

pytest 8.3.3

Проверим, что README.md доступен в /opt

cd opt
ls

README.md

В этой почти пустой директории можно сделать тестовый запуск pytest

python -m pytest

============================================================================== test session starts ============================================================================== platform linux -- Python 3.13.0rc2, pytest-8.3.3, pluggy-1.5.0 rootdir: /opt collected 0 items ============================================================================= no tests ran in 0.12s =============================================================================

Ubuntu контейнер

Если Python контейнер не подходит - можно воспользоваться контейнером с Linux , например Ubuntu .

В этом случае нужно позаботиться об установке Python самостоятельно

FROM ubuntu:24.04 LABEL maintainer="www.devhops.site" ENV TEST_DIR=/opt ENV PYTHONPATH=TEST_DIR ENV TZ=Europe/Helsinki ENV DEBIAN_FRONTEND=noninteractive RUN mkdir -p $TEST_DIR WORKDIR $TEST_DIR # old way - ADD # ADD src $TEST_DIR # new way - create VOLUME VOLUME $TEST_DIR # apt-get is recommended for Docker files # install linux utils RUN apt-get -y update \ && apt-get install -y dialog \ && apt-get install -y apt-utils \ && apt-get install -y tree vim \ && apt-get install -y curl gcc g++ make \ && apt-get -y update \ && apt-get -y upgrade # install python RUN apt-get install -y python3 python3-pip \ && apt-get install -y curl gcc g++ make \ && cd /usr/local/bin \ && ln -s /usr/bin/python3 python \ && python -m pip install --upgrade pip # install dependencies COPY requirements.ubuntu.pytest.txt . RUN python -m pip install -r requirements.ubuntu.pytest.txt

# requirements.ubuntu.pytest.txt pytest==7.2.0 requests==2.28.1

# docker-compose.yml version: '3.8' services: pytest_ubuntu: container_name: pytest_ubuntu image: pytest_ubuntu # priveleged: true # user: root build: context: ./dockerfiles dockerfile: Dockerfile.ubuntu.pytest args: buildversion: 1 ports: - "3000:3000" networks: net1: ipv4_address: 10.5.0.2 volumes: - ./src:/opt tty: true command: tail -F /dev/null networks: net1: driver: bridge ipam: config: - subnet: 10.5.0.0/16 gateway: 10.5.0.1

Автор статьи: Андрей Олегович