我应该在 docker 构建期间运行测试吗?

aah*_*nik 7 python testing docker python-poetry

我有一个像这样的 Dockerfile:

FROM python:3.9

WORKDIR /app

RUN apt-get update && apt-get upgrade -y

RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -

ENV PATH /root/.local/bin:$PATH

COPY pyproject.toml poetry.lock Makefile ./

COPY src ./src

COPY tests ./tests

RUN poetry install && poetry run pytest && make clean

CMD ["bash"]

Run Code Online (Sandbox Code Playgroud)

正如您所看到的,测试将在构建期间运行。它可能会稍微减慢构建速度,但会确保我的代码在 Docker 容器中运行。

如果测试在我的本地计算机中通过,并不意味着它们也会在 docker 容器中通过。

假设我在代码中添加了一个使用 chromedriver 或 ffmpeg 二进制文件的功能,该功能存在于我的系统中,因此测试将在我的系统中通过。

但是,假设我忘记在 Dockerfile 中安装这些依赖项,那么 docker 构建将会失败(因为测试在构建期间运行)

做我想做的事情的标准方法是什么?

我的 Dockerfile 好吗?或者我应该做一些不同的事情?

rsy*_*rsy 7

如果您使用多个阶段,您可以运行docker build并避免运行测试,如果您想稍后运行测试,则运行docker build --target test将在之前构建的内容上运行测试。docker 官方文档中对此方法进行了解释。

这样,我们不仅可以避免由于 Docker 缓存机制而运行两次构建,还可以避免将测试代码包含在镜像中。

在进行 CI/CD 时,此实现的一个可能的用例是在本地开发和在 CI 中运行这两个命令;并且不要运行 CD 中的测试命令,因为正在部署的代码已经经过测试。


Dan*_*les 5

在图像构建上运行 pytest 对我来说没有意义。但是,您可以做的是在图像完成后运行测试。在你的管道中你应该有这样的东西:

  1. 在本地测试你的 python 包
  2. 用诗造轮子
  3. 使用 python 包构建 docker 镜像
  4. 运行你的 docker 镜像来测试它是否有效(例如运行 pytests)
  5. 将测试的镜像发布到容器注册表

  • 我该怎么做第4点?我的意思是我应该将测试目录复制到图像中?(在定义 Dockerfile 时)并运行 `docker run pyproject Poetry run pytest` (2认同)