在构建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)
请帮助。
答案 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