繁体   English   中英

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

[英]Should I run tests during the docker build?

我有一个这样的 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好用吗? 或者我应该做些不同的事情吗?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM