Я создаю мультиконтейнерное приложение.Вот общий вид рабочего каталога:
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