将Docker容器用于前端和后端时,CORS会崩溃

use*_*685 7 python cors docker vue.js docker-compose

以下代码在docker容器外工作得很好.现在我想为后端添加一个容器,为后端添加另一个容器.所以我创建了两个Dockerfiles(可能是无趣的)和下面的docker-compose文件.我改axios.get('http://127.0.0.1:5000/api/test')axios.get('http://backend:80/api/test')在VUE组件.我能够从前端容器ping后端容器,我能够通过curl接收api结果. 但是 axios再也无法提出这个api请求了.在firefox控制台中我收到错误:

Error: "Network Error"
Cross-Origin request blocked [...] Reason: CORS request did not succeed
Run Code Online (Sandbox Code Playgroud)

但我能够在我的网络中的一台计算机和另一台计算机的前端运行docker之外的后端.所以Cross-Origin在docker之外没问题.这有什么问题?我不知道.


泊坞窗,compose.yml

version: '2'
services:
    backend:
        build: ./backend
        container_name: backend
        ports:
          - "80:80"
        environment:
          - FLASK_APP=app/main.py
          - FLASK_DEBUG=1
          - 'RUN=flask run --host=0.0.0.0 --port=80'
        networks:
          - some-net

    frontend:
        build: ./frontend
        container_name: frontend
        ports:
          - "90:80"
        networks:
          - some-net

networks:
    some-net:
        driver: bridge
Run Code Online (Sandbox Code Playgroud)

原始代码

python中的后端

from flask import Flask, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app, resources=r'/api/*')

@app.route('/api/test')
def test():
    return jsonify({
        "foo": "bar"
    })

if __name__ == '__main__':
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

frondend(仅限vue.js组件)

<template>
<div class="hello">
    <h1>Message is: {{ msg }}</h1>
</div>
</template>

<script>
import axios from 'axios'

export default {
name: 'HelloWorld',
data () {
    return {
        msg: ''
    }
},
created () {
    axios.get('http://127.0.0.1:5000/api/test').then(response => {
        console.log(response.data)
        this.msg = response.data.foo
    }).catch(error => {
        console.log(error)
    })
}
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped></style>
Run Code Online (Sandbox Code Playgroud)

Nei*_*ist 18

您似乎误解了如何从所有容器外部引用 docker 容器。

axios.get('http://127.0.0.1:5000/api/test')...
Run Code Online (Sandbox Code Playgroud)

应该指 docker 容器正在侦听的位置。在容器内部,这确实是backend,但在外部,即在您的 Web 浏览器中,它将是对运行容器的主机的引用,然后是端口。由于您已将其安装在主机的端口 80(前端为 90)上,您应该将其更新get为:

axios.get('http://{hostname or ip}:80/api/test')
Run Code Online (Sandbox Code Playgroud)

如果它们都在同一台主机上运行,​​那么您可以使用127.0.0.1或 localhost 进行测试。

  • 因此,您可以看到请求来自 Firefox,因此请求的参考框架是浏览器,这意味着您需要从 docker 外部引用服务。 (3认同)