Python Docker容器在运行flask应用程序后立即退出

Python Docker容器在运行flask应用程序后立即退出,python,docker,flask,neo4j,dockerfile,Python,Docker,Flask,Neo4j,Dockerfile,我已经找到了很多答案,但无法解决这个问题。请让我知道我可以做什么来运行docker容器 以下是我的设置: 我有一个Flask应用程序,它利用Neo4j docker映像进行DB。当Neo4j是docker容器,Flask应用程序是本地的时,它工作得很好。我需要建立我的烧瓶应用程序,使其成为docker图像。最后,我将在AWS上部署此应用程序 我以Docker映像的形式创建了我的应用程序,但当我尝试运行它时,它立即退出 CONTAINER ID IMAGE

我已经找到了很多答案,但无法解决这个问题。请让我知道我可以做什么来运行docker容器

以下是我的设置:

我有一个Flask应用程序,它利用Neo4j docker映像进行DB。当Neo4j是docker容器,Flask应用程序是本地的时,它工作得很好。我需要建立我的烧瓶应用程序,使其成为docker图像。最后,我将在AWS上部署此应用程序

我以Docker映像的形式创建了我的应用程序,但当我尝试运行它时,它立即退出

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                                      NAMES
eb7f66ffdaa2        re                  "python app.py"          2 hours ago         Exited (1) 2 hours ago                                                                 sad_curie
a9a02c84ef9a        re                  "python app.py"          2 hours ago         Exited (1) 2 hours ago                                                                 re
5b55004697f6        neo4j               "/docker-entrypoin..."   2 hours ago         Up 2 hours                  0.0.0.0:7474->7474/tcp, 7473/tcp, 0.0.0.0:7687->7687/tcp   mystifying_galileo
我的Dockerfile如下所示:

FROM ubuntu:latest
MAINTAINER Shantagouda Bk "shantu24@gmail.com"
RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]
这是日志中的错误:

Traceback (most recent call last):
  File "app.py", line 8, in <module>
    driver = GraphDatabase.driver("bolt://localhost:7687", auth=basic_auth("neo4j", "password"))
  File "/usr/local/lib/python2.7/dist-packages/neo4j/v1/api.py", line 124, in driver
    return driver_class(uri, **config)
  File "/usr/local/lib/python2.7/dist-packages/neo4j/v1/direct.py", line 65, in __init__
    pool.release(pool.acquire())
  File "/usr/local/lib/python2.7/dist-packages/neo4j/v1/direct.py", line 39, in acquire
    connection = self.acquire_direct(address)  # should always be a resolved address
  File "/usr/local/lib/python2.7/dist-packages/neo4j/bolt/connection.py", line 398, in acquire_direct
    connection = self.connector(address)
  File "/usr/local/lib/python2.7/dist-packages/neo4j/v1/direct.py", line 64, in <lambda>
    pool = DirectConnectionPool(lambda a: connect(a, security_plan.ssl_context, **config), self.address)
  File "/usr/local/lib/python2.7/dist-packages/neo4j/bolt/connection.py", line 468, in connect
    s.connect(address)
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address
回溯(最近一次呼叫最后一次):
文件“app.py”,第8行,在
驱动程序=图形数据库。驱动程序(“bolt://localhost:7687,auth=basic_auth(“neo4j”,“password”))
文件“/usr/local/lib/python2.7/dist-packages/neo4j/v1/api.py”,第124行,在驱动程序中
返回驱动程序类(uri,**配置)
文件“/usr/local/lib/python2.7/dist packages/neo4j/v1/direct.py”,第65行,在__
pool.release(pool.acquire())
文件“/usr/local/lib/python2.7/dist packages/neo4j/v1/direct.py”,第39行,在acquire中
connection=self.acquire_direct(地址)#应始终是已解析的地址
文件“/usr/local/lib/python2.7/dist packages/neo4j/bolt/connection.py”,第398行,直接获取
连接=自连接器(地址)
文件“/usr/local/lib/python2.7/dist-packages/neo4j/v1/direct.py”,第64行,在
pool=DirectConnectionPool(lambda:connect(a,security\u plan.ssl\u context,**config),self.address)
文件“/usr/local/lib/python2.7/dist packages/neo4j/bolt/connection.py”,第468行,在connect中
s、 连接(地址)
文件“/usr/lib/python2.7/socket.py”,第228行,meth格式
返回getattr(self.\u sock,name)(*args)
socket.error:[Errno 99]无法分配请求的地址

请告诉我缺少什么以及如何运行Flask应用程序映像。

您的应用程序尝试在
localhost:7687上连接数据库

当你的应用程序在你的主机上运行时,localhost=你的本地机器,这就是它工作的原因

但当你的应用程序在Docker容器中运行时,localhost=app container,所以它在自己的容器环境中找不到DB


您应该将数据库和应用程序放在同一网络中,并使用数据库的容器名称而不是本地主机。我建议使用docker compose来完成此任务。

正如@Munchkin所说,您错误地认为数据库运行在容器内的
localhost
上。下面是关于不需要
docker compose
的解决方案的更多详细信息。您可以使用或
--name

运行neo4j时,请使用:

docker run --network-alias neodb neo4j
或:

您应该能够从
bolt://neodb:7687

这假定您正在同一网络上运行两个容器。如果未明确指定,则两者都应在桥接的
网络上运行

对于Docker的旧版本,您可能需要改用


有关更多信息,请参见:

它显示您的容器以非零退出代码退出,这通常意味着出现了问题。你的日志显示了什么?@larsks我用错误日志编辑了这个问题。
docker run --name neodb neo4j