【发布时间】:2020-05-16 21:28:40
【问题描述】:
我有 docker-compose.yml 来调出两个 docker 容器。
1.) 前端 - reactjs - 在端口 3000 上运行
2.) 后端 - python (flask) - 在端口 8083 上运行
前端正在调用 python 服务器以通过 url "http://127.0.0.1:8083/api 使用 axios 获取 POST 方法,但现在由于它们在两个容器上运行,我如何将前端连接到python 服务器通过那个 url?
这是我的docker-compose.yml
version: "3.2"
services:
frontend:
build: ./frontend
environment:
CHOKIDAR_USEPOLLING: "true"
volumes:
- /app/node_modules
- ./frontend:/app
ports:
- 80:3000
depends_on:
- backend
backend:
build: ./backends/jananath
volumes:
- ./backends/jananath:/usr/src/app
environment:
FLASK_APP: /usr/src/app/server.py
FLASK_DEBUG: 1
FLASK_RUN_EXTRA_FILES: "/usr/src/app/banuka.txt"
ports:
- 5000:8083
这是server.py python 服务器
from flask import Flask, render_template, request, url_for, redirect
import os
from os import path, walk
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
PORT = 8083
@app.route('/api', methods=['POST', 'GET'])
def upload_file():
file = request.files['file']
filename = file.filename
print(filename)
filepath = os.path.abspath(filename)
print(filepath)
response_ = {}
response_['filename'] = str(filename)
response_['filepath'] = str(filepath)
return response_
if __name__ == '__main__':
app.run(host='0.0.0.0', port=PORT, extra_files=extra_files)
这是 axios 从 front-end 调用 POST 方法到这个 server.py
const onFormSubmit = async (e) => {
e.preventDefault();
const formData = new FormData();
formData.append("file", file);
try {
const res = await axios.post("http://127.0.0.1:8083/api", formData, { // this url should change now?
headers: {
"Content-Type": "multipart/form-data",
"Access-Control-Allow-Credentials": "true",
"crossorigin": "true",
},
});
const {filename, filepath} = res.data;
setUploadedFile({filename, filepath});
} catch (error) {
console.log(error);
}
};
我认为这里的问题是 URL 现在已更改,但我不知道如何解决。谁能告诉我如何解决这个问题以及我应该点击的正确 URL 是什么?
谢谢!
【问题讨论】:
-
React 应用程序通常运行在浏览器中,因此无法利用 Docker 网络。您需要使用运行容器的服务器的主机名;如果您在单个系统上运行这一切,那么您拥有的
127.0.0.1实际上可能会正常工作。 -
@DavidMaze 这是在同一台主机上运行的。但是使用
localhost:<port>/api不起作用。但是当我在本地运行它时(不使用docker)它可以工作。 -
您还需要来自
ports:的第一个端口号(您在Docker 之外发布的),所以127.0.0.1:5000。