Python Docker-在服务之间共享本地存储

Python Docker-在服务之间共享本地存储,python,docker,docker-compose,dockerfile,Python,Docker,Docker Compose,Dockerfile,我正在构建一个多容器应用程序。以下是工作目录的总体视图: MABSED/ |_ docker-compose.yml |_ ... |_ streamer/ | |_ Dockerfile | |_ startStreaming.py | |_ credentials.py |_ orchestrator/ |_ Dockerfile |_ requirements.txt |_ tasks.py |_ my_sched.py |_ data/ | |

我正在构建一个多容器应用程序。以下是工作目录的总体视图:

MABSED/
|_ docker-compose.yml
|_ ...
|_ streamer/
|  |_ Dockerfile
|  |_ startStreaming.py
|  |_ credentials.py
|_ orchestrator/
   |_ Dockerfile
   |_ requirements.txt
   |_ tasks.py
   |_ my_sched.py
   |_ data/
   |  |_ streaming/
   |  |_ preprocessed/
   |  |_ results/
   |_ detector/
   |_ filter/
   |_ lemmatizer/
我的应用程序有4种不同的服务:一个ElasticSearch容器、一个仪表板、一个从Twitter捕获推文的拖缆和一个执行任务并将结果保存在ElasticSearch中的编排器

这个问题只涉及两个服务,拖缆和编排器。正如我说过的,我希望这两个组件共享数据,应用于我的应用程序的内容意味着我希望编排器能够访问拖缆捕获的推文。此外,我希望这些数据存储在我的计算机本地目录
MABSED/orchestrator/data/
中,而不仅仅存储在容器中,以防在停止进程后需要访问这些信息

换句话说,当我编写
docker-compose
这两个容器时,我需要将数据存储在
MABSED/orchestrator/data/
中,并添加相应的文件,这样,当Streamer向
MABSED/orchestrator/data/streaming/
添加新文件时,orchestrator可以注意到此更改,并向
MABSED/orchestrator/data/results/
添加新文件

另外,
startStreaming.py
这是Streamer服务运行的脚本,它将数据保存到此相对路径
output_directory='../orchestrator/data/streaming'
,该脚本在本地运行正常,但我不知道是否会在Docker容器上运行

此时,我的
docker compose.yml
如下所示:

version: '2'

services:
  dashboard:
    build: demo-dashboard/
    ports:
     - "8080:8080"
    environment:
      - ES_ENDPOINT_EXTERNAL=http://localhost:9200
      - http.cors.enabled=true
      - http.cors.allow-origin=ES_ENDPOINT_EXTERNAL
      - http.cors.allow-headers=Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With
      - http.cors.allow-credentials=true
    volumes:
     - ./demo-dashboard:/usr/src/app
    networks:
      - dashboard-network

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.7.0
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - http.cors.enabled=true
      - http.cors.allow-origin=http://localhost:8080
      - http.cors.allow-headers=Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With
      - http.cors.allow-credentials=true
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    mem_limit: 1g
    cap_add:
      - IPC_LOCK
    volumes:
      - esdata1:/usr/share/elasticsearch/data
    networks:
      - dashboard-network
    ports:
      - 9200:9200

  orchestrator:
    image: orchestrator-mabsed
    build: orchestrator/
    environment:
      ES_HOST: 'elasticsearch'
    tty: true
    volumes:
      - ./orchestrator/data/:/usr/src/app/orchestrator/data

  streamer:
    image: streamer-mabsed
    build: streamer/
    tty: true
    volumes:
      - ./orchestrator/data/:/usr/src/orchestrator/data

volumes:
  esdata1:
    driver: local

networks:
  dashboard-network:
    driver: bridge
我想我需要创建一个卷来实现这一点,但我对Docker来说是比较新的,我不知道如何管理它

这是我的拖缆文件:

FROM python:3.6

RUN pip3 install --user tweepy

WORKDIR /usr/src/app/
COPY startStreaming.py /usr/src/app/
COPY credentials.py /usr/src/app/

CMD python startStreaming.py
FROM python:3.6

COPY . /usr/src/app/
WORKDIR /usr/src/app/
RUN pip3 install --user -r requirements.txt

CMD python my_sched.py
和我的编排器Dockerfile

FROM python:3.6

RUN pip3 install --user tweepy

WORKDIR /usr/src/app/
COPY startStreaming.py /usr/src/app/
COPY credentials.py /usr/src/app/

CMD python startStreaming.py
FROM python:3.6

COPY . /usr/src/app/
WORKDIR /usr/src/app/
RUN pip3 install --user -r requirements.txt

CMD python my_sched.py

您可以与您的服务共享同一本地目录。
只需确保您的代码相应地引用了目录(共享路径)。
在本例中,/usr/src/app/orchestrator/data

样本:-

orchestrator:
image: orchestrator-mabsed
build: orchestrator/
environment:
  ES_HOST: 'elasticsearch'
tty: true
volumes:
  - MABSED/orchestrator/data/:/usr/src/app/orchestrator/data

streamer:
 image: streamer-mabsed
 build: streamer/
 tty: true
 volumes:
  - MABSED/orchestrator/data/:/usr/src/app/orchestrator/data

我编辑了docker compose.yml,如问题中所示。现在拖缆工作了,文件在本地存储库中生成,尽管在容器中导航/usr/src/orchestrator/目录不存在,但我不知道为什么。然而,Orchestrator服务并没有意识到已经创建了新文件,因为它仍然要求一个已经存在的文件。知道我需要添加什么吗?在streamer应用程序中,您可以检查共享目录的路径吗?当前它是-./orchestrator/data/:/usr/src/orchestrator/data不应该是-./orchestrator/data/:/usr/src/app/orchestrator/dataI映射了该路径中的主机目录,因为我的拖缆脚本将文件保存在本地
。/orchestrator/data/streaming/
,我希望它在本地和容器中具有一致性。两个容器中的命运路径应该相同,还是只与卷的源路径有关@VineetPalanis除了尝试使用文件系统,您还可以使用一些外部数据存储;例如,主要在Elasticsearch中存储数据?这样就避免了这个问题,更容易扩展服务,并且在集群环境中工作得更好。