Докер создает конфигурацию для нескольких экземпляров одного изображения с разными аргументами - PullRequest
0 голосов
/ 23 октября 2018

У меня есть приложение cli, которое может запускать две службы на основе входного аргумента.

1- app serve // to run a web server
2- app work  // to run a long-running background worker

они используют один и тот же код.Что мне нужно, когда для развертывания?

 A: two separate containers or
 B: two processes in the same container 

И что будет конфигурация docker-compose?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Если вы хотите иметь один процесс на контейнер, я бы предложил иметь общий образ (и Dockerfile), который может работать как рабочий или как сервер.

Файл Dockerfile должен установить точку входа в приложениеНапример, ENTRYPOINT ["/path_to_my_app/myapp"], но не CMD.Когда пользователь вызывает команду из командной строки, он может запустить работника с docker run IMAGENAME work или с сервера с docker run IMAGENAME serve.

Чтобы определить обе службы в файле компоновки, необходимо переопределить command поле для каждой услуги.

version: '3'
services:
  web:
      build: ./docker    # common Dockerfile
      image: IMAGENAME
      ports:
          - "8090:8090"
      command: ["serve"]

  worker:
      build: ./docker    # common Dockerfile
      image: IMAGENAME   # reuse image
      ports:
          - "8091:8091"
      command: ["work"]

Преимущество этого решения по сравнению с решением с двумя отдельными изображениями заключается в повышении удобства обслуживания.Поскольку существует только один Dockerfile и один образ, обе службы должны быть всегда совместимы.

0 голосов
/ 23 октября 2018

после некоторого поиска в Google, я обнаружил, что, как сказал @sauerburger в комментариях, лучше иметь один процесс на контейнер.

Но иметь несколько контейнеров для каждого моего основного приложения с определенным аргументом (т. Е. Одиндля основного приложения и одного для рабочего) Мне нужно иметь несколько Dockerfiles.в моем docker-compose я могу ссылаться на них по отдельности.

но как использовать разные dockerfiles для проекта?

предпочтительным решением является наличие каталога docker, в котором каждая часть имеет свой собственныйпапка.для моего приложения это будет выглядеть так:

- docker
    - web
        -Dockerfile
    - worker
        -Dockerfile

, тогда в каждом Dockerfile у меня будет общая точка входа и отдельный cmd:

-in web Dockerfile :
    - ENTRYPOINT ["/path_to_my_app/myapp"]
    - CMD ["web"]

-in worker Dockerfile :
    - ENTRYPOINT ["/path_to_my_app/myapp"]
    - CMD ["worker"]

, после этого мой файл docker-compose будетссылаться на них так:

version: '3'
services:
      web:
          # will build ./docker/web/Dockerfile
          build: ./docker/web
          ports:
              - "8090:8090"

      worker:
          # will build ./docker/worker/Dockerfile
          build: ./docker/worker
          ports:
              - "8091:8091"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...