我在通过Flask应用程序(也是docker化的)从docker-selenium容器中获取数据时遇到问题。
当我在一个容器中运行Flask应用程序时,我在http://localhost:5000上收到以下错误,该错误使用在http://localhost:4444/wd/hub上运行的远程驱动程序传递给硒驱动程序。
生成的错误是:
urllib.error.URLError: <urlopen error [Errno 99] Cannot assign requested address>
我已经创建了一个带有代码进行测试的github存储库,请参见here。
下面的我的docker-compose文件看起来还可以:
version: '3.5'
services:
web:
volumes:
- ./app:/app
ports:
- "5000:80"
environment:
- FLASK_APP=main.py
- FLASK_DEBUG=1
- 'RUN=flask run --host=0.0.0.0 --port=80'
command: flask run --host=0.0.0.0 --port=80
# Infinite loop, to keep it alive, for debugging
# command: bash -c "while true; do echo 'sleeping...' && sleep 10; done"
selenium-hub:
image: selenium/hub:3.141
container_name: selenium-hub
ports:
- 4444:4444
chrome:
shm_size: 2g
volumes:
- /dev/shm:/dev/shm
image: selenium/node-chrome:3.141
# image: selenium/standalone-chrome:3.141.59-copernicium
depends_on:
- selenium-hub
environment:
- HUB_HOST=selenium-hub
- HUB_PORT=4444
奇怪的是,当我在Pycharm中运行Flask应用程序,并且在docker中建立了硒网格时,我能够通过http://localhost:5000取回数据。仅在Flask应用在docker内部运行时才会发生此问题。
在此先感谢您的帮助,如果您需要更多信息,请告诉我。
因此,我修改了docker-compose.yml文件以包含一个网络(更新了github中的代码。由于我在调试和批量运行Flask应用程序代码,因此对代码的任何更新都会刷新一次调试器。
我在创建的网络上运行docker network inspect
,找到了selenium-hub的本地docker IP地址。我更新了app/utils.py
中的get_driver()
代码,以使用command_executor
中的IP地址而不是localhost
中的IP地址。保存并在浏览器中重新运行会成功返回数据。
但是我不明白为什么http://localhost:4444/wd/hub
无法正常工作,docker容器应该在网络中以localhost的身份看到对方,对吗?
答案 0 :(得分:1)
docker容器应该在网络中以localhost的身份相互访问,对吗?
否,只有当他们使用主机网络并通过主机公开端口时,情况才如此。
当服务在docker-compose(或堆栈)中相互交互时,服务应通过服务名称相互引用。例如。您将到达http://selenium-hub:4444/wd/hub
的集线器容器。同一网络上http://web
如果您通常在运行docker时的默认设置是使用主机网络,则可能会感到困惑,因为在主机网络selenium-hub
上也暴露在同一端口4444上。因此,如果您启动具有主机网络的容器,则可能也可以在那里使用http://localhost:4444
。
答案 1 :(得分:0)
是否可能是与执行相关的端口使用问题?