python-2.7 - 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)
解决方案
我尝试连接的容器是组成被测应用程序的 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。)
推荐阅读
- python-3.x - 在 Python 中建立一个模拟数据库以进行单元测试
- javascript - JavaScript:从全局函数返回的多个变量不能被对象访问
- oracle-apex - Oracle APEX - 区域显示选择器 - 选择特定选项卡
- cron - 使用 cron 运行 ansible-playbook
- java - 401 Malformed HTTP basic Authorization header: Error on execution api through RestTemplate
- apache-kafka - Kafka - 并非所有消费者都会收到订阅的消息
- reactjs - 在打开 React.-bootstrap Navbar 下拉菜单时,我想防止正文滚动
- c# - MassTransit.ActiveMQ 是网络标准吗?
- php - 删除 WooCommerce 可变产品上的重置变体按钮
- mysql - 使用现有数据将数据从 csv 加载到表中