Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker compose for java后端和python前端应用程序_Java_Python_Docker_Docker Compose - Fatal编程技术网

Docker compose for java后端和python前端应用程序

Docker 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下,

我有一个简单的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
下,我可以添加元素。一切都很好

作为前端,我有一个简单的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