Создать контейнер для PyTest в Docker
Введение | |
Структура проекта | |
На основе Python | |
Код докерфайла | |
На основе Ubuntu | |
Код докерфайла | |
Сборка и публикация | |
Статьи про 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.ru" # 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.ru" 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