我最近开始使用docker,并且将python应用程序容器化。我使用了以下Dockerfile。
FROM python:3.6.5
# working directory
WORKDIR /usr/src/app
# copy requirement file to working directory
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
ENTRYPOINT ["python", "./run.py"]
我有一些使用pytest调用的单元测试。我在想如何将其包含在docker容器中,以便单元测试可以在docker容器中运行。我是否应该为此构建一个不同的图像。您对此有何建议?
答案 0 :(得分:4)
我不确定您的应用程序的规模如何,为什么要使用Docker?仅仅因为您的应用程序正在Docker中运行,并不意味着您也应该在Docker中运行测试。
从最低努力到最高努力,这些都是您可以检查的几种选择。
$ python -m unittest tests/*
如果您正在考虑不破坏本地依赖关系,而只是想使用Docker,则可以使用venv并在其中运行测试。
$ python3 -m venv venv
$ . venv/bin/activate
$ python3 -m unittest tests/*
然后您可以删除目录或虚拟环境
如果您正在编写一个认真的项目,这是理想的解决方案。 Jenkins(或类似工具)支持dockerized运行作业。每次您要运行作业时,Jenkins都会创建一个docker容器。 您只需要指定要发出的命令即可,就像在第一个选项中那样简单。这是Jenkins with Docker support的链接。
答案 1 :(得分:0)
如果您有正在运行的容器的名称,
您可以使用 docker execute
假设您想通过 pytest
指定测试路径来运行一些测试
在名为/标记为“my_container”的容器上:
docker exec my_container pytest ./tests/superstuff/
注意 2 件事:
./
路径相对于您的 WORKDIR
--user
端点覆盖它,如下所示:docker exec --user myuser:mygroup my_container pytest ./tests/superstuff/
至少在 Linux(Ubuntu) 上,您还可以使用 $(id -u):$(id -g)
- 获取运行命令的用户的 id 和默认组
答案 2 :(得分:-1)
您可以编写另一个Dockerfile来更改入口点,也可以在使用命令运行Dockerfile时覆盖入口点
docker run --entrypoint
如果您的命令需要参数,请确保在图像名称之后传递参数
docker run --entrypoint "pytest" image_name arg1 arg2 ...