Как мне создать Dockerfile, который позволяет мне создавать два разных контейнера в зависимости от параметра командной строки? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть проект с текущей версией, назовем его A, и будущую версию, которую мы назовем B.

Обе go службы находятся в одном проекте под .../cmd/A и .../cmd/B.

Я хотел бы создать контейнер docker для A и еще один для B.

Я вижу здесь , что я Можно добавить FROM ... для каждого в Dockerfile, но как мне использовать docker - composer для создания двух отдельных контейнеров? В идеале это должен быть флаг командной строки или два разных файла docker - composer. (Или, может быть, я тоже могу иметь два разных Dockerfile)

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Вы можете сделать это с docker точками входа так же, как это сделано ниже

docker -композит

  rubygems-1:
    container_name: "ruby-container-1"
    image: My-image
    command:  service-b
  rubygems-2:
    container_name: "ruby-container-2"
    image: My-image
    command: service-a

docker file

FROM ruby:2.6.3-alpine
COPY ./docker-entrypoint.sh /

ENTRYPOINT ["/docker-entrypoint.sh"]

docker -входная точка

#!/bin/sh -e

case $1 in

  service-a)
    bundle exec puma -C config/puma.rb
  ;;

  service-b)
    bundle exec puma -C config/puma2.rb
  ;;

  *)
    exec "$@"
  ;;

esac

exit 
1 голос
/ 06 марта 2020

Каждый отдельный контейнер, который вы объявляете в файле docker-compose.yml, может иметь отдельный блок build:. Это может объявить отдельный dockerfile: для каждого изображения. В контексте пакета Go вам, вероятно, потребуется всегда включать в пакет весь пакет, в частности, файл go.mod в хранилище root.

Так что, если ваш макет каталога выглядит так:

myapp
+-- docker-compose.yml
+-- Dockerfile.A
+-- Dockerfile.B
+-- go.mod
+-- go.sum
\-- cmd
  +-- A
  | \-- main.go
  \-- B
    \-- main.go

Тогда вы можете указать свой файл docker-compose.yml на оба Dockerfiles:

version: '3'
services:
  version-a:
    build:
      context: .
      dockerfile: Dockerfile.A
  version-b:
    build:
      context: .
      dockerfile: Dockerfile.B

Если у вас есть один Dockerfile, который собирает и устанавливает обе версии пакет, вы также можете переопределить command: для каждого контейнера, в соответствии с директивой Dockerfile CMD:

version: '3'
services:
  version-a:
    build: .
    command: A
  version-b:
    build: .
    command: B
...