使用docker compose测试Django应用程序

时间:2018-04-01 12:16:12

标签: django docker docker-compose

我正在使用docker-compose来启动我的Django应用程序。我在开发和测试之间保持数据量分离时遇到问题。代码的开发版本如下所示,并且数据存储在Postgres,Elasticsearch和Redis中:

version: '3'
services:

  db:
    image: postgres:9.6.6
    ports:
      - "5435:5432"
    environment:
      - POSTGRES_PASSWORD=example
    volumes:
       - pg-data:/var/lib/postgresql/data

  redis:
    image: redis:3.2.6
    volumes:
       - redis-data:/data

  redis_cache:
    image: redis:3.2.6

  elasticsearch:
    image: elasticsearch:5.6.6
    volumes:
       - elasticsearch-data:/usr/share/elasticsearch/data

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    ports:
      - "8000:8000"
    environment:
    - DATABASE_URL=postgresql://postgres:example@db/postgres
    - ENVIRONMENT=development
    - REDIS_URL=redis://redis:6379
    - REDIS_CACHE_URL=redis://redis_cache:6379
    - ELASTIC_ENDPOINT=elasticsearch:9200
    env_file: docker.env
    depends_on:
      - db
      - redis
      - redis_cache
      - elasticsearch
    volumes:
      - .:/code

volumes:
  pg-data: {}
  redis-data: {}
  elasticsearch-data: {}

我为该应用程序创建了另一个版本的文档,名为docker-compose.test.yml。每次我启动这个版本的应用程序,我想使用Postgres,Elasticsearch等的新副本。但它不会那样工作。目标是在测试期间填充一些数据,然后在关闭时将其全部删除。

我以为我可以简单地启动没有命名卷的服务来完成此任务。像这样:

 db:
    image: postgres:9.6.6
    environment:
      - POSTGRES_PASSWORD=example

然后我用:

运行测试
docker-compose -f docker-compose.test.yml run --rm web python manage.py test --verbosity=2

但我注意到的是测试指的是与命名卷pg-data相同的数据。所以我没有数据库的新副本。我没想到那种行为。我可以在docker-compose的测试版本中命名一些不同的卷,比如pg-test-data,但是它们会在运行测试后保持不变,需要手动删除。

那么这个问题的正确解决方案是什么?

0 个答案:

没有答案