设置简单的docker-compose配置进行测试的正确方法是什么?

时间:2018-05-06 19:45:31

标签: python docker testing docker-compose devops

我当前的docker-compose.yml档案:

version: '2'
services:
  app:
    restart: always
    build: ./web
    ports:
      - "8000:8000"
    volumes:
      - ./web:/app/web
    command: /usr/local/bin/gunicorn -w 3 -b :8000 project:create_app()
    environment:
      FLASK_APP: project/__init__.py
    depends_on:
      - db
    working_dir: /app/web

  db:
    image: postgres:9.6-alpine
    restart: always
    volumes:
      - dbvolume:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app

volumes:
  dbvolume:

我现在正在尝试创建一个覆盖以前文件进行测试的docker-compose-test.yml文件。我想到的是用这个:

version: '2'
services:
  app:
    command: pytest

  db:
    volumes:
      - dbtestvolume:/var/lib/postgresql/data

volumes:
  dbtestvolume:

然后使用以下命令运行测试:

docker-compose -f docker-compose.yml -f docker-compose-test.yml run --rm app

据我所知,应该只覆盖与用于开发的docker文件相比的不同方面,即使用的命令和存储数据的数据量。

该命令被成功覆盖,但遗憾的是数据量保持不变,因此如果我运行测试,我的应用程序数据将被覆盖。

这是为测试设置docker配置的正确方法吗?关于出了什么问题的任何建议?

如果这不是正确的方法,设置docker-compose配置进行测试的正确方法是什么?

替代测试

我尝试更改我的docker-compose-test.yml文件以使用其他服务(db-test)进行测试:

version: '2'
services:
  app:
    command: pytest
    depends_on:
      - db-test

  db-test:
    image: postgres:9.6-alpine
    restart: always
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app

现在发生的事情是,在运行我的测试时,我的数据没有被覆盖(因此,在某种程度上,它可以工作,欢呼!)但是如果我尝试运行命令:

docker-compose down

我得到了这个输出:

Stopping app_app_1 ... done
Stopping app_db_1  ... done
Found orphan containers (app_db-test_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.

然后docker-compose down失败。所以没有正确配置。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果您不想保留数据库数据,请不要使用卷,因此每次启动容器时都会有一个新数据库。

我猜你的表中需要一些预先填充的数据,所以只需构建一个复制所需数据的新数据库图像。 Docker文件可能类似于:

FROM postgres:9.6-alpine

COPY db-data/ /var/lib/postgresql/data

如果您需要更新数据,请使用db-data/安装-v,更改并重建图片。

顺便说一句,使用Jenkins,GitLab CI,Travis或任何适合您的解决方案,最好使用自动化管道来测试您的构建。无论如何,您也可以在管道中使用docker-compose,以使其与本地开发环境保持一致。