Docker build pytest:无法建立新连接:[Errno 111]连接被拒绝

时间:2018-07-06 11:05:06

标签: python django docker pytest

在构建docker时,我面临着一个严重的问题。 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 :(得分:1)

您无法在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

答案 1 :(得分:1)

这是在容器构建阶段使用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

这里没有魔术发生-我使用an example Django project found on 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