繁体   English   中英

Docker Cloud自动测试找不到服务

[英]Docker Cloud autotest cant find service

我目前正在尝试对我的Django API项目之一进行docker化。 它使用postgres作为数据库。 我将Docker Cloud用作CI,以便可以构建,运行和运行测试。

我从以下DockerFile开始

# Start with a python 3.6 image
FROM python:3.6

ENV PYTHONUNBUFFERED 1
ENV POSTGRES_USER postgres 
ENV POSTGRES_PASSWORD xxx 
ENV DB_HOST db 

RUN mkdir /code

ADD . /code/

WORKDIR /code

RUN pip install -r requirements.txt

RUN pylint **/*.py

# First tried running tests from here.

RUN python3 src/manage.py test

但是此DockerFile始终失败,因为Django在运行单元测试时无法连接到任何数据库,并且由于以下错误而失败,因为此Dockerfile中未运行postgres实例

django.db.utils.OperationalError: could not translate host name "db" 
to address: Name or service not known

然后,我在Docker Cloud中发现了一个称为“自动测试”的东西,它使您可以使用docker-compose.text.yml文件来描述堆栈,然后在每次构建时运行一些命令。 这似乎是我运行测试所需要的,因为它将允许我构建Django映像,引用已经存在的postgres映像并运行测试。

我删除了

 RUN python3 src/manage.py test

从DockerFile并创建以下docker-compose.test.yml文件。

 version: '3.2'

 services:
   db:
     image: postgres:9.6.3
     environment:
       - POSTGRES_USER=$POSTGRES_USER
       - POSTGRES_PASSWORD=$POSTGRES_PASSWORD

   sut:
     build: .
     command: python src/manage.py test
     environment:
       - POSTGRES_USER=$POSTGRES_USER
       - POSTGRES_PASSWORD=$POSTGRES_PASSWORD
       - DB_HOST=db
     depends_on:
       - db

那我跑的时候

  docker-compose -f docker-compose.test.yml build

  docker-compose -f docker-compose.test.yml run sut

在本地,所有测试都会运行并全部通过。

然后,我将更改推送到Github,并由Docker Cloud构建它。 构建本身会成功,但使用docker-compose.test.yml文件的自动测试会失败,并出现以下错误:

  django.db.utils.OperationalError: could not connect to server: 
  Connection refused
  Is the server running on host "db" (172.18.0.2) and accepting
  TCP/IP connections on port 5432?

如此看来,与我的本地计算机相比,db服务似乎没有启动或在Docker Cloud上启动太慢?

在Google浏览了一下之后,我发现了这个https://docs.docker.com/compose/startup-order/ ,上面说容器并没有真正等待对方100%准备就绪。 然后,他们建议编写包装器脚本以等待postgres(如果确实需要)。

我按照他们的指示使用了wait-for-postgres.sh脚本。

多汁的部分:

  until psql -h "$host" -U "postgres" -c '\l'; do
    >&2 echo "Postgres is unavailable - sleeping"
    sleep 1
  done

并替换了我的docker-compose.test.yml中的命令

 command: python src/manage.py test

 command: ["./wait-for-postgres.sh", "db", "python", "src/manage.py", 
 "test"]

然后我推到Github,开始构建Docker Cloud。 构建映像可以正常工作,但是现在自动测试只会永远等待postgres(我等待了10分钟,然后手动关闭了Docker Cloud中的构建过程)

我今天有Google-d,似乎大多数“ Dockerize Django”教程都根本没有提到单元测试。

我使用Docker运行Django单元测试是否完全错误?

我似乎很奇怪,它在本地运行得很好,但是当Docker Cloud运行它时,它会失败!

我似乎已通过将文件中的docker-compose版本从3.2降级到2.1并使用healthcheck修复了该问题。

healthcheck选项在Depends_on子句中给我带来语法错误,因为您必须将数组传递给它。 不知道为什么3.2版不支持此功能

但是这是我的新docker-compose.test.yml

version: '2.1'

services:
  db:
    image: postgres:9.6.3
    environment:
      - POSTGRES_USER=$POSTGRES_USER
      - POSTGRES_PASSWORD=$POSTGRES_PASSWORD
    healthcheck:
      test: ["CMD-SHELL", "psql -h 'localhost' -U 'postgres' -c 
            '\\l'"]
      interval: 30s
      timeout: 30s
      retries: 3

 sut:
   build: .
   command: python3 src/manage.py test
   environment:
     - POSTGRES_USER=$POSTGRES_USER
     - POSTGRES_PASSWORD=$POSTGRES_PASSWORD
     - DB_HOST=db
   depends_on:
   // Does not work in 3.2
     db:
       condition: service_healthy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM