【问题标题】:Should I run tests during the docker build?我应该在 docker 构建期间运行测试吗?
【发布时间】:2021-04-14 08:52:54
【问题描述】:

我有一个像这样的 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"]

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

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

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

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

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

我的 Dockerfile 好吗?还是我应该做一些不同的事情?

【问题讨论】:

  • 图像是逐层构建的,在 Dockerfile 中,每条指令都会在生成的图像中创建一个层。根据我的理解,每次执行测试都会使缓存失效,因为后续层不会从缓存中加载,因此您将无法充分利用缓存概念来加速后续构建。
  • 感谢您的洞察力。我是 docker 新手,我不知道这一点。
  • 没问题,请通过以下链接了解 docker 文件最佳实践:(!)docs.docker.com/develop/develop-images/… (2) 对于 Python:pythonspeed.com/articles/docker-caching-model
  • 问题是 Docker 不适合运行测试。我相信测试应该是您管道的一部分。您需要一个与您将在其中运行代码以进行生产的容器环境相同的测试环境(使用相同的映像,即 )。部署后可以在映像上运行测试。我不会将它们包含在 dockerfile 中。将测试应用于该环境,并在它们通过标记构建时。然后你知道 build X.X.X 通过了测试。当你有了这个机制后,你就可以在管道的“测试阶段”使用它。

标签: python docker testing python-poetry


【解决方案1】:

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

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

【讨论】:

  • 我将如何做第 4 点?我的意思是我应该将测试目录复制到图像中? (在定义 Dockerfile 时)并运行 docker run pyproject poetry run pytest
  • 这是一个选项,但您将进行单元测试。在第 4 点中您需要进行完整性测试,您或许应该调用公共方法来查看执行是否正确。
猜你喜欢
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
相关资源
最近更新 更多