微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

连接多个docker容器docker-compose-front->api->solr

如何解决连接多个docker容器docker-compose-front->api->solr

我想连接多个 docker 容器。我有 3 项服务:

我可以创建后端来查询 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,});
        }
      )
    }

我尝试代替 localhost:5000/myquery 使用 api:5000/myquery 或 solr:5000/myquery,但都不起作用 - 当我检查浏览器中的元素时,我得到 ERR_NAME_NOT_RESOLVED 或 404。我在这里阅读了一些主题。我能够基于此修复我之前的问题(它在 api 和 solr 之间连接 - 我使用 docker-compose.yml 中的链接修复了它),但现在我正在通过前端使用它。

解决方法

正如 DavidMaze 所建议的,这归结为在 @app.route('/myquery') 中没有训练 / 并且在 fetch("http://localhost:5000/myquery/") 中有它。从 fetch 中移除训练 / 有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。