我正在使用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,但是它们会在运行测试后保持不变,需要手动删除。
那么这个问题的正确解决方案是什么?