我可以在同一个容器中运行Flask和Neo4j吗?

2024-04-27 04:19:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我对码头工人的世界还不熟悉。我的文件夹如下所示:

app/
   __init__.py
   api.py
   data_loader.py

首先,我运行data_loader.py将数据加载到Neo4j数据库。 然后我以python -m app.api的形式启动flask服务器

FlaskAPI需要一个本地Neo4j数据库,所以我希望flask和Neo4j都在同一个Docker容器中。我该怎么办?Dockerfile和Docker Compose之间的差异让我感到困惑


Tags: 数据dockerpy文件夹api数据库appflask
1条回答
网友
1楼 · 发布于 2024-04-27 04:19:14

您通常只希望在容器中运行一个程序。如果其中一个程序是数据库,而另一个程序是存储数据的应用程序,则尤其如此:您希望能够在保持数据库运行的同时替换应用程序容器,在生产环境中,您可能希望运行多个应用程序容器以实现规模和冗余,但仍然有一个数据库副本

Docker Compose是一个由YAML文件驱动的标准工具,可用于描述需要协同工作的多个容器:

# docker-compose.yml
version: '3.8'
services:
  application:
    build: .
    ports:
      - '5000:5000'
    environment:
      NEO4J_HOST: database # see below
  database:
    image: neo4j:4.2 # https://hub.docker.com/_/neo4j
    volumes:
      - dbdata:/data
volumes:
  dbdata:

每个容器都有自己的localhost,因此您需要将应用程序配置为在其他地方查找数据库。组合服务名称applicationdatabase在此Docker环境中可用作主机名(不由其他组合设置使用,也不由浏览器应用程序使用,即使它们是由Docker提供的,也不直接从主机提供)^Docker文档中的{a1}进一步描述了这一点

这意味着您的应用程序将需要某种方式来配置数据库位置。环境变量易于使用:

from neo4j import GraphDatabase
import os

db_host = os.environ.get('NEO4J_HOST', 'localhost')
db_port = os.environ.get('NEO4J_PORT', '7687')
driver = GraphDatabase.Driver(f'neo4j://{db_host}:{db_port}')

这里的默认值适用于主机非Docker开发环境。在docker-compose.yml文件中,可以指定备用环境变量设置,即上面的environment:

在生产中,您可能非常合理地希望在其他地方运行数据库:如果您的云提供商有托管版本的Neo4j,您可以使用它,或者您可能希望在专用硬件上运行数据库,即使系统的其余部分在Docker中运行。环境变量机制允许您根据需要进行配置;这不是Docker特有的

您不需要在Dockerfile中执行任何特殊操作。PythonNeo4j驱动程序似乎没有特殊的主机需求,因此将其包含在requirements.txtPipfile中并构建一个普通的Python应用程序映像就足够了。不要在源代码或Dockerfile中包含数据库位置或凭据(如果未设置环境变量,则超出面向开发人员的默认值)

相关问题 更多 >