Как запустить скрипт Python (для тестирования) с помощью Docker?

Контекст:
Я создал приложение Flask, которое делает объект JSON доступным на localhost/api. Я также использую nginx и Gunicorn для создания своего сервера. Все это приложение контейнеризируется с помощью Docker.

Докерфайл:

FROM python:3.10
ENV CONTAINER_HOME=/var/www
ADD . $CONTAINER_HOME
WORKDIR $CONTAINER_HOME
RUN pwd 
RUN pip3 install -r $CONTAINER_HOME/requirements.txt
# RUN python3 $CONTAINER_HOME/src/tests/tests.py ???? Should I add this line?

докер-compose.yml:

version: '3.8'

services:
  nginx:
    image: nginx:1.25
    container_name: nginx
    volumes:
      - ./nginx-config/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 80:80
    networks:
      - my-network
    depends_on:
      - flask
  flask:
    build:
      context: ./
      dockerfile: Dockerfile
    container_name: flask
    command: gunicorn --bind 0.0.0.0:8000 "src.api.app:app"
    volumes:
      - ./:/var/www
    networks:
      my-network:
        aliases:
          - project

networks:
  my-network:

Требования:
Теперь я хочу протестировать свой API. Я написал скрипт Python (см. test.py в Dockerfile), который отлично работает в моей локальной среде и выполняет тесты.

Проблема:

  1. Я хочу автоматизировать тестирование API в контейнере Docker, а не делать это вручную на своем хост-терминале.
  2. Как только контейнер начнет работать и мой объект JSON станет доступен, только тогда я хочу запустить файл test.py, в котором есть тесты, которые я хочу выполнить для моего объекта JSON на localhost/api.

Как мне решить эту проблему? Как автоматизировать тест с помощью Docker? Возможно, в Dockerfile или в docker-compose. Или мне следует создать другой подкаталог в каталоге моего проекта и создать отдельный файл Dockerfile для запуска test.py?

Пожалуйста помоги.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
221
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предположим, что структура проекта такая:

├── app.py
├── docker-compose.yml
├── Dockerfile
├── nginx-config
│   └── nginx.conf
├── requirements.txt
└── test.py

🗎 docker-compose.yml (Добавьте сервис test, который использует то же изображение, что и созданный для сервиса flask.)

version: '3.8'

services:
  nginx:
    image: nginx:1.25
    container_name: nginx
    volumes:
      - ./nginx-config/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 80:80
    depends_on:
      - flask

  flask:
    container_name: flask
    image: flask:latest
    build:
      context: ./
      dockerfile: Dockerfile
    container_name: flask
    command: gunicorn --bind 0.0.0.0:8000 "app:app"

  test:
    image: flask:latest
    container_name: test
    depends_on:
      - nginx
    command: python3 test.py

🗎 Dockerfile

FROM python:3.10

ARG CONTAINER_HOME=/var/www

ADD . $CONTAINER_HOME
WORKDIR $CONTAINER_HOME

RUN pip3 install -r requirements.txt

🗎 requirements.txt

Flask==3.0.2
gunicorn==21.2.0
requests==2.31.0

Минимальное приложение и тесты:

🗎 app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

🗎 test.py

import requests

def test_api():
    url = "http://nginx:80/"

    response = requests.get(url)
    assert response.status_code == 200, "API did not return 200 OK!"
    assert response.text == "Hello, World!", "API response did not match!"

if __name__ == "__main__":
    test_api()
    print("Test passed!")

Теперь, когда вы запускаете стек, служба test будет запускаться последней и проверять API через NGINX.

Благодаря тонну! Принял ваш ответ 👍

Bob 26.02.2024 08:42

Другие вопросы по теме