Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用多个Docker容器测试应用程序_Python_Docker_Testing_Docker Compose - Fatal编程技术网

Python 使用多个Docker容器测试应用程序

Python 使用多个Docker容器测试应用程序,python,docker,testing,docker-compose,Python,Docker,Testing,Docker Compose,我有一个与不同类型的数据库交互的非常简单的应用程序(由SQLAlchemy支持)。我需要测试应用程序是否能与每个必需的数据库引擎正常工作,检查这些引擎的不同版本和不同的Python版本 我目前的解决方案是使用Docker和Docker Compose。我定义了许多docker compose.yml文件,在我的CI工具中,我只是开始测试每个配置文件。或多或少,它看起来是这样的: ├── python-35 │   ├── postgresql-10 │   │   ├── Dockerfile

我有一个与不同类型的数据库交互的非常简单的应用程序(由SQLAlchemy支持)。我需要测试应用程序是否能与每个必需的数据库引擎正常工作,检查这些引擎的不同版本和不同的Python版本

我目前的解决方案是使用Docker和Docker Compose。我定义了许多
docker compose.yml
文件,在我的CI工具中,我只是开始测试每个配置文件。或多或少,它看起来是这样的:

├── python-35
│   ├── postgresql-10
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   ├── postgresql-11
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   ├── postgresql-12
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   ├── postgresql-9
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   └── sqlite-3
│       ├── Dockerfile
│       └── docker-compose.yml
├── python-36
│   ├── postgresql-10
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   ├── postgresql-11
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   ├── postgresql-12
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   ├── postgresql-9
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   └── sqlite-3
│       ├── Dockerfile
│       └── docker-compose.yml
├── python-37
│   ├── postgresql-10
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   ├── postgresql-11
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   ├── postgresql-12
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   ├── postgresql-9
│   │   ├── Dockerfile
│   │   └── docker-compose.yml
│   └── sqlite-3
│       ├── Dockerfile
│       └── docker-compose.yml
└── python-38
    ├── postgresql-10
    │   ├── Dockerfile
    │   └── docker-compose.yml
    ├── postgresql-11
    │   ├── Dockerfile
    │   └── docker-compose.yml
    ├── postgresql-12
    │   ├── Dockerfile
    │   └── docker-compose.yml
    ├── postgresql-9
    │   ├── Dockerfile
    │   └── docker-compose.yml
    └── sqlite-3
        ├── Dockerfile
        └── docker-compose.yml
要运行单个测试套件,我使用以下命令:

docker-compose --file=var/docker/python-35/postgresql-9/docker-compose.yml build --no-cache
docker-compose --file=var/docker/python-35/postgresql-9/docker-compose.yml run -w /app app_python_35_postgresql_9 /venv/bin/pytest
docker-compose --file=var/docker/python-35/postgresql-9/docker-compose.yml down
我对此有一些问题。首先,我需要这样定义它。我觉得有点难以维持。在一个循环中启动所有测试套件是可能的,但将其保存在存储库中仍然是一件非常难看的事情。下一个问题是性能。单个测试套件需要30秒才能运行。当我每次使用Docker构建图像时,需要4分钟。当我将它乘以20(当前配置的数量)时,它给出了80分钟——这是每次推送后运行测试所需的时间。我不确定这是否是可以修复的,但无论如何值得一提

不过还有最后一个问题——它并不总是有效的。当我在本地的mashine上运行完整的套件时,需要一段时间才能完成,但它正在工作。当我在我的CI(TeamCity)中执行同样的操作时,我没有成功地运行完整的测试套件(20个配置),而不会出现错误

下面是示例
docker compose.yml

version: '2'
services:
  db_python_35_postgresql_9:
    container_name: db_python_35_postgresql_9
    image: postgres:9.6.16-alpine
    restart: always
    ports:
      - 15432:15432
    environment:
      - POSTGRES_DB=app
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - PGPORT=15432
  app_python_35_postgresql_9:
    build:
      context: ../../../../
      dockerfile: ./var/docker/python-35/postgresql-9/Dockerfile
      args:
        MIGRATOR_CONNECTION_STRING: postgresql://postgres:postgres@db_python_35_postgresql_9:15432/app
    depends_on:
      - db_python_35_postgresql_9
    links:
      - db_python_35_postgresql_9
下面是我得到的示例错误:

2 matches found based on name: network postgresql-9_default is ambiguous
Removing network postgresql-9_default
network postgresql-9_default is ambiguous (2 matches found based on name)
Process exited with code 1
它并不总是同时发生。每次运行
docker compose down
后,我都会移除容器,但它仍然会像那样崩溃。我试图重命名容器,因此现在每个容器都有一个唯一的名称(如
db\u python\u 35\u postgresql\u 9
app\u python\u 35\u postgresql\u 9
),但它仍然崩溃


现在,有什么方法可以实现我需要的,但更简单?我在Docker方面不是很在行。也许它允许我做同样的事情,避免我遇到的问题?我试着读一些关于Kubernetes的文章,但我不确定这是否是处理类似测试的正确方法。我真的需要一些帮助:-)

是一个专门构建的工具,用于测试多个Python版本;这将有助于消除其中的一个方面。您不必为不同的数据库服务器版本重建应用程序。@DavidMaze它看起来很有希望,但我使用Docker来避免在我的系统中安装所有这些数据库引擎。有更好的方法吗?我正在为每个数据库重建映像,以便每次都能进行干净的安装。您可以
docker运行数据库,并在指向该数据库的非docker虚拟环境中运行应用程序。tox甚至具有和
命令\u post
设置,可用于设置每次执行的数据库。是否可以添加dockerfile的内容,但不确定是否每次都需要为测试的不同版本的postgress生成该文件。您可以构建多达一个经过测试的python版本,而不是每个python+postgress版本都有一个。与您获得的网络相关的错误是docker compose默认情况下基于文件夹名称创建名称为的网络。添加一个在每个文件网络中唯一的网络名称:py db:name:db_python_35_postgresql_9和take-away链接。是一个专门构建的工具,用于测试多个Python版本;这将有助于消除其中的一个方面。您不必为不同的数据库服务器版本重建应用程序。@DavidMaze它看起来很有希望,但我使用Docker来避免在我的系统中安装所有这些数据库引擎。有更好的方法吗?我正在为每个数据库重建映像,以便每次都能进行干净的安装。您可以
docker运行数据库,并在指向该数据库的非docker虚拟环境中运行应用程序。tox甚至具有和
命令\u post
设置,可用于设置每次执行的数据库。是否可以添加dockerfile的内容,但不确定是否每次都需要为测试的不同版本的postgress生成该文件。您可以构建多达一个经过测试的python版本,而不是每个python+postgress版本都有一个。与您获得的网络相关的错误是docker compose默认情况下基于文件夹名称创建名称为的网络。添加一个在每个文件网络中唯一的网络名称:py db:name:db_python_35_postgresql_9和take-away链接。