Docker - делиться локальным хранилищем между сервисами - PullRequest
1 голос
/ 19 июня 2019

Я создаю мультиконтейнерное приложение.Вот общий вид рабочего каталога:

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 различные службы: контейнер ElastisSearch, панель мониторинга, Streamer, который захватывает твиты из Twitter, и Orchestrator, который выполняет задачу и сохраняетприводит к ElasticSearch.

Этот вопрос касается только двух сервисов: Streamer и Orchestrator.Как я уже сказал, я хочу, чтобы эти два компонента обменивались данными, то, что применимо к моему приложению, означает, что я хочу, чтобы Orchestrator имел доступ к твитам, захваченным Streamer.Более того, я хочу, чтобы эти данные были сохранены в локальном каталоге моего компьютера MABSED/orchestrator/data/, а не только в контейнере, на случай, если мне понадобится получить доступ к этой информации после того, как я остановлю процесс.

Другими словами, янужно, чтобы при выполнении docker-compose up эти два контейнера получали данные, хранящиеся в 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и я не знаю, как с этим справиться.

Вот мой Dockerfile Streamer :

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

и мой Dockerfile Orchestrator :

FROM python:3.6

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

CMD python my_sched.py

1 Ответ

1 голос
/ 20 июня 2019

Вы можете использовать один и тот же локальный каталог со своими службами.
Просто убедитесь, что ваш код соответственным образом относится к каталогу (общий путь).
В этом случае / usr / src / app /оркестратор / данные

Образец: -

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...