我很欣赏有关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