运行烧瓶应用程序后,Docker容器立即退出

我已经经历了很多的答案,但无法解决这个问题。 请让我知道我可以做什么来运行docker集装箱。

这是我的设置:

我有使用Neo4j泊坞窗图像为DB的Flask应用程序。当Neo4j是泊坞窗容器和烧瓶应用程序是本地时,它工作正常。 我需要build立我的Flask应用程序,使其泊坞窗形象。 最后,我将在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 

请让我知道我缺less什么以及如何运行Flask应用程序图像。

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

当你的应用程序在你的主机上运行时,localhost =你的本地机器,这就是为什么它可以工作。

但是当你的应用程序在一个Docker容器中运行,那么localhost = app容器,所以它不能在自己的容器环境中find一个数据库。

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

正如@Munchkin所说,你错误地认为数据库在容器内的localhost上运行。 这里有一些不需要docker-compose的解决scheme的更多细节。 您可以使用--network-alias--name

运行neo4j时使用:

 docker run --network-alias neodb neo4j 

要么:

 docker run --name neodb neo4j 

您应该能够从bolt://neodb:7687上的Flask容器访问您的数据库。

这假定你在同一个networking上运行两个容器。 如果没有明确指定,则应该在bridgednetworking上运行。

对于旧版本的Docker,您可能需要使用--link

有关更多信息,请参阅: https : //docs.docker.com/engine/userguide/networking/configure-dns/