无法从另一个容器

时间:2017-05-11 00:47:00

标签: python docker flask docker-compose dockerfile

我很欣赏有关Flask和Docker的很多问题,还有更多关于如何在docker容器中运行简单的Flask API的博客文章。

但是,我遇到了一个问题,即在容器内运行的Flask API遇到了麻烦,我已经从另一个容器中设置了主机(0.0.0.0)和端口(5000)。有趣的是,如果我启动容纳API的容器,我可以从本地浏览器访问API。

我想要实现的是首先启动一个托管Postgres数据库的容器,然后托管一个Flask API(后端使用Postgres,最后启动一个运行某些单元测试的容器)数据库和API。

以下是docker-compose.yml文件:

version: "3"

services:

  app:
    build:
      context: ../
      dockerfile: docker/app.Dockerfile
    ports:
      - "5000:5000"
    depends_on:
      - db
    networks:
      - todo_backend

  tests:
    build:
      context: ../
      dockerfile: docker/tests.Dockerfile
    ports:
      - "80:8000"
    depends_on:
      - db
      - app
    networks:
      - todo_backend

  db:
    image: postgres:9.5
    restart: on-failure
    environment:
      POSTGRES_PASSWORD: changeme
      POSTGRES_USER: docker
      POSTGRES_DB: testdb
    ports:
      - "5432"
    networks:
      - todo_backend


networks:
  todo_backend:
    driver: bridge

API的Dockerfile是:

FROM python:3.5-slim

COPY requirements.txt /app/requirements.txt

RUN apt-get update && \
  apt-get install -y wget

RUN wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh -P /usr/bin/ && \
  chmod +x /usr/bin/wait-for-it.sh

WORKDIR /app

RUN pip install -r requirements.txt

COPY . /app

ENTRYPOINT ["/bin/bash"]

CMD ["app/entrypoint.sh"]

以下是尝试访问API的容器的Dockerfile ...

FROM python:3.5-slim

COPY requirements.txt /todo/requirements.txt

RUN apt-get update && \
  apt-get install -y wget

RUN wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh -P /usr/bin/ && \
  chmod +x /usr/bin/wait-for-it.sh

WORKDIR /todo

RUN pip install -r requirements.txt

COPY . /todo

EXPOSE 80

ENTRYPOINT ["/bin/bash"]

CMD ["tests/entrypoint.sh"]

当我运行测试时,我首先使用docker-compose build构建图像,然后运行docker-compose up tests

这是我收到的错误消息:

tests_1  | E           requests.exceptions.ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=5000): Max retries exceeded with url: /todo/api/v1.0/tasks (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x7fc08e2489b0>: Failed to establish a new connection: [Errno 111] Connection refused',))

我缩短了它,因为它的时间更长但问题似乎是tests容器似乎无法访问地址http://0.0.0.0:5000处的API。< / p>

我忘记提及的一件事是entrypoint.sh文件的内容。它们看起来像下面那样:

set -e

bash wait-for-it.sh --timeout=5 db:5432

python app/app.py

正如我上面提到的,问题在于达到API。我可以毫无问题地对数据库运行所有自动化测试,但由于某些原因似乎无法连接到API。

这是容器和端口的列表:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
1ea4d2b60d32        docker_app          "/bin/bash app/ent..."   20 minutes ago      Up 20 minutes       0.0.0.0:5000->5000/tcp    docker_app_1
09c21e7354ba        postgres:9.5        "docker-entrypoint..."   20 minutes ago      Up 20 minutes       0.0.0.0:32816->5432/tcp   docker_db_1

0 个答案:

没有答案
相关问题