【发布时间】: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