【发布时间】:2021-01-05 12:00:37
【问题描述】:
我想连接多个 docker 容器。我有 3 项服务:
- solr 存储文档并返回查询结果
- Flask 后端查询 solr
- 将前端请求响应到烧瓶后端以获取 solr 结果并使用 fetch 显示在页面上
我能够创建后端来查询 solr 并在将 url 放入浏览器时显示结果。但是,我无法使用 fetch 从前端代码中使用该端点。我还可以查询另一个后端端点,但它只是一个虚拟端点,返回“hello world” - 所以我怀疑问题出在 3 个容器之间的连接上(因为后端连接到 solr,但前端不能连接到它上面)。
我的 docekr-compose.yml 文件:
version: '3.8'
services:
api-service:
build: api
volumes:
- ./api/:/backend
environment:
- FLASK_ENV=development
- FLASK_APP=app.py
ports:
- "5000:5000"
networks:
- solr
depends_on:
- solr
links:
- solr
front:
build: front
volumes:
- ./front:/frontend
- node-modules:/frontend/node_modules
environment:
- NODE_ENV=development
ports:
- "3000:3000"
depends_on:
- api-service
links:
- api-service
- solr
solr:
image: solr:8.5
container_name: solr
ports:
- "8983:8983"
networks:
- solr
command:
- solr-precreate
- gettingstarted
volumes:
node-modules:
networks:
solr:
我连接到 Solr 的 Flask 代码:
BASE_PATH='http://solr:8983/solr/gettingstarted/select?q=%2A:%2A'
@app.route('/myquery', methods=['GET', 'POST'])
def my_query_solr():
connection = urlopen("{}".format(BASE_PATH))
response = simplejson.load(connection)
return response
我的 js 代码到达 Flask 端点:
submitHandler = (e) => {
e.preventDefault();
fetch("http://localhost:5000/myquery/")
.then(res => res.json())
.then(
(result) => {console.log(result["response"]["docs"])},
(error) => {
this.setState({
isLoaded: true,
error,
});
}
)
}
我尝试使用 api:5000/myquery 或 solr:5000/myquery 代替 localhost:5000/myquery,但两者都不起作用 - 当我在浏览器中检查元素时,我得到 ERR_NAME_NOT_RESOLVED 或 404。我在这里读了几个线程。我能够基于此解决我之前的问题(它在 api 和 solr 之间连接 - 我使用 docker-compose.yml 中的链接修复了它),但现在我正在通过前端使用它。
【问题讨论】:
-
浏览器应用程序永远不能使用 Docker 内部的主机名;在开发环境中
http://localhost:5000/myquery是最有可能的 URL。您是否在 Flask 日志中看到匹配的请求? -
嗨@DavidMaze,当我尝试从 React 查询 localhost:5000/myquery 时,我得到“api-service_1 | 192.168.112.1 - - [05/Jan/2021 12:04:41]” GET /myquery/ HTTP/1.1" 404 -" 在日志中。当我查询 localhost:5000/hello 时(这是一个只返回“hello world”的虚拟 Flask 端点,它可以工作)。
-
你有
@app.route('/myquery'),后面没有/。将路由更改为带有斜杠,或从 URL 末尾删除斜杠是否会有所不同?如果 Flask 报告 404 错误,那么所有 Docker 级别的接线都是正确的。 -
解决了这个问题!非常感谢@DavidMaze,我已经尝试解决这个问题好几个小时了......
标签: docker docker-compose containers connect