Как мне иметь несколько docker изображений для одного проекта в одном каталоге? - PullRequest
0 голосов
/ 26 января 2020

Для моего текущего проекта python у меня есть несколько «программ», которые я хочу запустить одновременно (например, сканер, индексатор, веб-сервер, postgresql server et c). Все эти python программы имеют несколько общих модулей в одном каталоге. Я не хочу создавать разные каталоги для каждой программы, так как для этого потребуется иметь несколько копий этих общих модулей в разных местах. Я не могу иметь несколько файлов Docker в одном каталоге для каждой программы (я не думаю?). Я почти уверен, что хочу использовать docker -compose, но после того, как я соберу свои отдельные образы из отдельных dockerfiles.

Что мне делать в этой ситуации? Я почти уверен, что думаю, что все это неправильно, потому что не могу представить, что это необычная проблема.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Есть два простых ответа в чистом-Docker пространстве.

Первое, что вы можете сделать, это упаковать весь ваш код в одно изображение:

FROM python:3
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["./main.py"]

Вы можете переопределить часть команды в команде docker run или в файле docker-compose.yml, поэтому запустите несколько контейнеров из одного образа.

version: '3'
services:
  crawler:
    build: .
    command: ./crawl.py
  indexer:
    build: .
    command: ./indexer.py

Или вы можете иметь несколько файлов Docker в тот же каталог

version: '3'
services:
  crawler:
    build:
      context: .
      dockerfile: Dockerfile.crawler
  indexer:
    build:
      context: .
      dockerfile: Dockerfile.indexer

и эти файлы Docker могут быть более ограниченными

FROM python:3
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY common common
COPY crawler crawler
COPY crawler.py .
CMD ["./crawler.py"]

Какой подход к использованию зависит от вашей кодовой базы. Если это интерпретируемый язык, почти весь код является общим, и единственное реальное отличие - это команда, которую вы выполняете, тогда, вероятно, лучше всего иметь одно изображение. Но если зависимости библиотек существенно различаются для каждой зависимости или если вам необходимо создать отдельный двоичный файл для каждого процесса, отдельный образ для каждого имеет больший смысл.

0 голосов
/ 28 января 2020

Вы можете использовать docker compose в этом сценарии. Предположим, вы хотите запустить тестирование двух контейнеров и запустить его в случае применения узла.

docker -compose.yml

version : 3

services:
  runApp:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      -"3000:3000"
  testApp: 
    build: 
      context: .
      dockerfile: Dockerfile.dev
    command: ["npm","run","test"]    

Dockerfile.dev

FROM node:alpine

WORKDIR "/webapp"
COPY ./package.json .
RUN npm install
COPY ./ ./

CMD ["npm","run","start"]

Используйте docker-compose up для построения образа и запуска контейнера.

...