Docker compose for java后端和python前端应用程序
我有一个简单的spring boot java后端应用程序,它从列表中获取元素(endpointDocker compose for java后端和python前端应用程序,java,python,docker,docker-compose,Java,Python,Docker,Docker Compose,我有一个简单的spring boot java后端应用程序,它从列表中获取元素(endpoint/get/{id}),并将元素添加到列表中(endpoint/add/{product}): 现在我可以构建映像(docker build-t java_backend.)并运行应用程序(docker run--rm-p8080:8080 java_backend) 因此,在localhost:8080/get/0下,我得到了“test”,在localhost:8080/add/something下,
/get/{id}
),并将元素添加到列表中(endpoint/add/{product}
):
现在我可以构建映像(docker build-t java_backend.
)并运行应用程序(docker run--rm-p8080:8080 java_backend
)
因此,在localhost:8080/get/0
下,我得到了“test”
,在localhost:8080/add/something
下,我可以添加元素。一切都很好
作为前端,我有一个简单的python应用程序,如:
from flask import Flask, request
import requests as r
import os
app = Flask(__name__)
@app.route("/")
def renderProduct():
return """
<html>
<head>
<title>""" + os.environ["title"] + """</title>
</head>
<form id="1" method="POST">
<input name="getID"/>
<br>
<input name="addID">
<input type="submit">
</form>
</html>
"""
@app.route("/", methods=["POST"])
def queryAndRender():
builded = "<html>"
if request.form["getID"] is not None:
resp = r.get("http://localhost:8080/get/" + request.form["getID"])
builded = builded + "PRODUCT:" + resp.text + "<br>"
if request.form["addID"] is not None:
resp = r.get("http://localhost:8080/add/" + request.form["addID"])
builded = builded + "ADDED ID:" + resp.text + "<br>"
builded = builded + """<html>
<head>
<title>""" + os.environ["title"] + """</title>
</head>
<form id="1" method="POST">
<input name="getID"/>
<br>
<input name="addID">
<input type="submit">
</form>
</html>
"""
return builded;
if __name__ == "__main__":
app.run()
最后,我创建了docker compose.yml
文件来运行它们:
version: '3.3'
services:
backend:
image: java_backend
ports:
- "8080:8080"
frontend:
image: frontend
ports:
- "8081:80"
现在,我尝试启动docker compose—构建后端前端
前端和后端是独立工作的,因此如果我尝试放置
localhost:8080/get/0
,我会得到“test”
,如果我转到localhost:8081
,我会看到我的前端。但如果我在文本框中输入一些值,然后单击submit,那么我就得到了500个内部服务器错误。所以服务没有连接。你能告诉我为什么吗?我想你是无意中删除了后端端口。试着替换
RUN sed -i 's/localhost:8080/backend/g' /main.py
与
我还有一个问题要问。假设我希望从容器开始前端,但后端只从本地IDE(IntelliJ)开始 当然,行
RUN sed-i's/localhost:8080/backend/g'/main.py
会被注释,所以frontent在http://localhost:8080
在这种情况下,前端处于
http://localhost:8081
和http://localhost:8080
(两个端点-/get/{id}
和/add/{product}
)。但是为什么在容器中运行的前端没有“看到”我的后端?您需要查看容器日志以了解为什么会出现500错误。如果后端应用程序正在侦听端口8080,而不是端口80(在容器中,ports:
此处无所谓),则连接将失败。最好使用像os.environ['BACKEND\u URL']
这样的环境变量,而不是在映像构建时尝试使用sed
修改源代码http://localhost:8080/get/“+request.form[“getID”])我应该把os.environ['BACKEND\u URL']
放在"http://localhost:8080“
所以我将有:resp=r.get(os.environ['BACKEND\u URL']+”/get/“+request.form[“getID”])
在我的本地计算机上的位置后端\u URL=htp://localhost:8080
。我说的对吗?看起来对,是的。我不知道。我明白它为什么现在能工作。你能解释一下吗?@milko在以前的版本中,你已经用后端
替换了所有本地主机:8080
,从端点URL中删除了端口号。应用程序ried在默认端口80上连接到后端。但是后端在8080上侦听。这很清楚。我们可以说运行sed-i's/localhost:8080/backend/g'/main.py
等于运行sed-i's/localhost:8080/backend:80/g'/main.py
ARG version=3.8.5-alpine3.11
FROM python:${version}
ENV title="Hello world"
ENV test testspacja
ENV FLASK_APP=/main.py
RUN pip install Flask==1.1.2
RUN pip install requests==2.22.0
COPY main.py /
RUN sed -i 's/localhost:8080/backend/g' /main.py
EXPOSE 80/tcp
ENTRYPOINT ["flask", "run"]
CMD ["-h", "0.0.0.0", "-p", "80"]
version: '3.3'
services:
backend:
image: java_backend
ports:
- "8080:8080"
frontend:
image: frontend
ports:
- "8081:80"
RUN sed -i 's/localhost:8080/backend/g' /main.py
RUN sed -i 's/localhost:8080/backend:8080/g' /main.py