Docker build pytest: не удалось установить новое соединение: [Errno 111] Соединение отклонено - PullRequest
0 голосов
/ 06 июля 2018

Я столкнулся с серьезной проблемой при сборке докера.Pytest не работает, но после сборки (удалите часть Pytest) та же самая работа Pytest изнутри контейнера

Вот мой файл Docker:

    FROM phusion/baseimage:0.9.22

    RUN apt-get update && apt-get install -y build-essential git libaio1 libffi-dev libjpeg-dev libssl-dev libxml2-dev python-wand libmagickwand-dev\
        libxslt-dev libz-dev  python3-pip python3-setuptools unzip


    ADD requirements.pip /
    RUN pip3 install -r /requirements.pip

    VOLUME ["/app"]
    WORKDIR /app
    ADD . .


    EXPOSE 8000
    RUN python3  manage.py runserver 0.0.0.0:8000 &
    RUN python3  -m pytest tests/test_demo.py

Вот мой тестовый файл:

    import requests

    def test_demo():
        response = requests.get('http://0.0.0.0:8000/' + "demo")
        assert (response.status_code == 200)

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

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Вот минимальный рабочий пример тестов, запущенных с pytest-django на этапе сборки контейнера.

тестовый скрипт

# test_server.py
import requests


def test_about_page(live_server):
    response = requests.get(live_server.url + '/about')
    response.raise_for_status()

Обратите внимание, что я использовал прибор live_server, который запускает отдельный экземпляр сервера в другом потоке. Затем я могу получить доступ к адресу через live_server.url в тесте.

Аналогично, изменения, которые необходимо внести в ваш тест, будут:

import requests

def test_demo(live_server):
    response = requests.get(live_server.url + "/demo")
    assert (response.status_code == 200)

образец Dockerfile

FROM ubuntu:latest

RUN apt update && apt install git python3-pip -y \
    && pip3 install pytest-django django requests
RUN git clone https://github.com/Microsoft/project-python-django-webapp
ADD test_server.py project-python-django-webapp
WORKDIR project-python-django-webapp

RUN pytest -v --ds=python_webapp_django.settings

Здесь не происходит никакой магии - я использовал пример проекта Django, найденного на Github , для запуска теста.

сборка контейнера

Сборка контейнера запускает сервер django и выполняет тест, завершаясь при успешном тестировании:

$ docker build -t so/example .
Sending build context to Docker daemon  3.072kB
Step 1/6 : FROM ubuntu:latest
 ---> 113a43faa138
Step 2/6 : RUN apt update && apt install git python3-pip -y && pip3 install pytest-django django requests
 ---> Using cache
 ---> fd7adbe53cc8
Step 3/6 : RUN git clone https://github.com/Microsoft/project-python-django-webapp
 ---> Using cache
 ---> df514c1343c9
Step 4/6 : ADD test_server.py project-python-django-webapp
 ---> 118f74e43370
Step 5/6 : WORKDIR project-python-django-webapp
Removing intermediate container f81db838a81d
 ---> c3d35262f37c
Step 6/6 : RUN pytest -v --ds=python_webapp_django.settings
 ---> Running in e6292f2ac3e8
============================= test session starts ==============================
platform linux -- Python 3.6.5, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 -- /usr/bin/python3
cachedir: .pytest_cache
Django settings: python_webapp_django.settings (from command line option)
rootdir: /project-python-django-webapp, inifile:
plugins: django-3.3.2
collecting ... collected 1 item

test_server.py::test_index PASSED                                        [100%]

=========================== 1 passed in 1.13 seconds ===========================
Removing intermediate container e6292f2ac3e8
 ---> c78c589b6d74
Successfully built c78c589b6d74
Successfully tagged so/example:latest
0 голосов
/ 06 июля 2018

Вы не можете запустить фоновый процесс в Dockerfile или чем-то похожем на него.В частности, команда

RUN python3 manage.py ... &

немедленно завершается, и при этом промежуточный контейнер с фоновым процессом удаляется.

Я бы не стал запускать этот пример кода изнутриDockerfile.Я бы закончил с

CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]

Создайте и запустите образ

docker build -t myimage .
docker run -p 8000:8000 myimage

Измените сценарий, чтобы он принимал расположение сервера в качестве переменной среды (0.0.0.0 никогда не является действительным IP-адресомк которому подключиться)

import requests
import os
def test_demo():
   response = requests.get(os.environ['SERVER_URL'] + '/demo')
   assert(response.status_code == 200)

и затем запустить (при условии, что вы запускаете клиент с того же хоста)

SERVER_URL=http://localhost:8000 pytest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...