首页 > 解决方案 > python docker容器发送的http请求被另一个容器听到并响应,但第一个容器没有听到响应

问题描述

我正在尝试构建 docker 映像以部署 python 应用程序 RESTful API 的自动化测试。我正在使用 docker-compose 运行应用程序,它构建了几个容器(网络服务器、后端服务器、数据库、nginx 等)。有一个单独的 python/pytest 应用程序,它通过 nginx 容器向目标应用程序发送 HTTPs
当在本地运行 pytest 并指向容器的 url 时,一切都很好。当从测试 repo dockerfile 构建的 docker 容器运行时,后端服务会听到并响应所有请求。nginx 容器日志显示正确的调用和预期的响应代码。后端容器日志显示已收到并响应了调用。
pytest 容器失败...python2.7/site-packages/future/utils/__init__.py:456: RestRequestException

我是 Docker 新手,还不知道如何回到抛出错误的地方。

这是环境信息(docker容器pytest运行):

root@17ad466cd12f:/code/app# pytest -vvvvv
============================= test session starts ==============================
platform linux2 -- Python 2.7.9, pytest-4.3.0, py-1.8.0, pluggy-0.12.0 -- /root/.pyenv/versions/2.7.9/bin/python2.7
cachedir: .pytest_cache
rootdir: /code/app, inifile: pytest.ini
plugins: pspec-0.0.3, tavern-0.26.4

两个基本问题: 1. 对如何进行的建议?2. 其他人看到了吗?看起来测试容器听不到来自应用程序端点的响应。

在尝试了一些事情(盲目地)之后,nginx 容器不再监听来自 pytest 容器的 http 调用。现在刚刚得到

ConnectionError: HTTPSConnectionPool(host='api.dev.bdev.us', port=443): Max retries exceeded with url: /api/v2/profiles/ (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7fcddede8550>: Failed to establish a new connection: [Errno 111] Connection refused',))

这是 Dockerfile:

FROM bepress/build-base-python:2.7.9

ENV API_TEST_SERVICE  .dev.bdev.us

RUN apt-get update && apt-get install -y \
  python-virtualenv \
  python-argparse \
  nano \
  curl \
  git

CMD bash

# Switch to Python 2.7.9 globally
RUN pyenv global 2.7.9
RUN pip install pip --upgrade
RUN pip install --upgrade --ignore-installed six setuptools
RUN pip install ndg-httpsclient pyasn1 pyOpenSSL

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code
RUN pip install --ignore-installed -r requirements.txt --cache-dir /pip-cache
WORKDIR /code/app
ADD . /code/app
EXPOSE 80 
EXPOSE 443

运行命令:

docker run --name egs-api-tests -i python2 bash

尝试从发布端口 80 和 443 的 nginx 容器监听对 http 请求的响应。

尝试 -p 443:443 或 -p 80:80 会引发端口已在使用中的错误。

从容器 ping 到 google.com 工作,到 api.dev.bdev.us(到 nginx 服务容器的 url)

标签: python-2.7restdockerhttpport

解决方案


我尝试连接的容器是组成被测应用程序的 docker-compose 容器组的一部分。docker-compose 构建了一个应用容器网络 (swng-dev_default),我现在可以将我的 api 测试容器链接到该网络。HTTP 现在可以往返。

docker run --name egs-api-tests -i --network swng-dev_default python2 bash

一切都很好,除了我需要直接访问数据库(容器中的 postgres 名为 swng-dev_swng_db_1 数据库名称 = content_service)

所以这个问题就解决了。

只需要弄清楚 psycopg2 需要发送什么或 db 容器需要接受什么。(端口 5432 由 db 容器发布(0.0.0.0:5432->5432/tcp。)


推荐阅读