【问题标题】:Run py.test in a docker container as a service在 docker 容器中作为服务运行 py.test
【发布时间】:2016-02-18 14:44:27
【问题描述】:

我正在建立一个 dockerised selenium 网格。我可以通过附加到 pytest 容器 [见下文] 发送我的 python 测试 [使用 pytest 运行]。 但是我已经设置了另一个 LAMP 容器来控制 pytest。 所以我想让 pytest 容器独立,运行空闲并等待来自 LAMP 容器的命令。

我有这个 Dockerfile:

# Starting from base image
FROM ubuntu

#-----------------------------------------------------
# Set the Github personal token
ENV GH_TOKEN blablabla

# Install Python & pip
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y python python-pip python-dev && pip install --upgrade pip

# Install nano for #debugging
RUN apt-get install -y nano

# Install xvfb
RUN apt-get install -y xvfb

# Install GIT
RUN apt-get update -y && apt-get install git -y

# [in the / folder] 
RUN git clone https://$GH_TOKEN:x-oauth-basic@github.com/user/project.git /project

# Install dependencies via pip
WORKDIR /project
RUN pip install -r dependencies.txt
#-----------------------------------------------------

#
CMD ["/bin/bash"]

我用这个手动启动 pytest 容器 [用于开发]:

docker run -dit -v /project --name pytest repo/user:py

问题是我完成了开发,我希望从docker-compose 启动 pytest 容器并将其连接到其他容器 [带有链接和卷]。 我就是不能熬夜。

我用过这个:

pytest:
  image: repo/user:py
  volumes:
    - "/project"
  command: "/bin/bash tail -f /dev/null"

但没用。

那么,在 Dockerfile 中,我应该使用特定的 CMD 还是 ENTRYPOINT ?

我应该使用docker-compose 文件中的一些command 吗?

【问题讨论】:

  • 你的 docker run 有 -dit 这很奇怪,它要么是 d 要么是它,而不是两者,是的,你的 Dockerfile 应该有一个 CMD 或 ENTRYPOINT
  • 我首先使用 -dit 启动它,这样我就拥有了免费的控制台,然后我使用 compose 启动了另一个容器,该容器取决于第一个启动的容器。我知道它应该有,但是包含的命令是什么来保持它??
  • 我猜@user2915097 的意思是您不需要it,只需-d 即可将容器作为守护进程(后台)运行。 -it 可用于交互式运行容器并分配 tty。
  • 我明白了。我可以使用 -d 让它在后台运行,并让主机控制台可用,并且以后仍然可以附加到容器。

标签: python docker pytest docker-compose dockerfile


【解决方案1】:

我最近在我的一个项目中启用了它。我使用多阶段构建。目前我将测试放在与源test_*.py 相同的文件夹中。根据我的经验,这并不自然,我更喜欢将测试放在默认排除的自己的文件夹中。

FROM python:3.7.6 AS build
WORKDIR /app
COPY requirements.txt .
RUN pip3 install --compile -r requirements.txt && rm -rf /root/.cache
COPY src /app
# TODO precompile

# Build stage test - run tests
FROM build AS test
RUN pip3 install pytest pytest-cov && rm -rf /root/.cache
RUN pytest --doctest-modules \
  --junitxml=xunit-reports/xunit-result-all.xml \
  --cov \
  --cov-report=xml:coverage-reports/coverage.xml \
  --cov-report=html:coverage-reports/

# Build stage 3 - Complete the build setting the executable
FROM build AS final
CMD [ "python", "./service.py" ]

为了将测试文件排除在覆盖范围之外。 .coveragerc 必须存在。

[run]
omit = test_*

test 目标运行所需的测试并生成覆盖率和执行报告。这些不适用于 Azure DevOps 和 SonarQube。让它适合

sed -i~ 's#/app#$(Build.SourcesDirectory)/app#' $(Pipeline.Workspace)/b/coverage-reports/coverage.xml

运行测试

#!/usr/bin/env bash
set -e
DOCKER_BUILDKIT=1 docker build . --target test --progress plain

【讨论】:

  • 出色的解决方案,只希望 docker build 可以将 pytest 的颜色编码转发到控制台。您也可以将其与 Github 操作集成吗?我打算编写完整的管道并将其自动化,但我对这个主题还很陌生。
  • 我的一位面试候选人为他们的工作申请做了一些事情。不是 Python,但仍然是多阶段 docker 构建,所以我知道这是可能的。
【解决方案2】:

我不确定您的测试是如何执行的,但我想我有一个类似的用例。您可以在cmd.sh 和a sample test 中的Envoy project 和a sample test 中看到我是如何做到这一点的。

这是我运行测试的方式。我也在使用 pytest,但这并不重要: 1. 使用 docker-compose 调出堆栈,无需测试 2. 等待堆栈准备好接受请求。对我来说,这意味着轮询 200 响应 3. 单独运行测试容器,但确保它使用与撰写堆栈相同的网络。

这可以通过多种方式完成。你可以把这一切都放在一个 Bash 脚本中,然后从你的主机上控制它。

就我而言,这一切都是从 Python 容器中完成的。它有点绕你的头,但想法是有一个主机启动的 Python 测试容器。然后容器本身使用 compose 将堆栈带回主机(dockerception)。然后在测试容器中我们运行 pytest 测试。完成后,它会向下组合堆栈并向上推返回码。

【讨论】:

    【解决方案3】:

    首先,您必须使用“docker images”获取图像列表。 然后查看列表并确保您的图像存在。 所以用“docker run”运行你的 docker 镜像。

    不要忘记这个注意事项:你必须在 DockerFile 中使用 CMD 来使用你的容器运行 pytest。

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 2020-08-11
      • 1970-01-01
      • 2018-09-02
      • 2018-10-23
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多