Docker -компоновать образы каскадной сборки - PullRequest
1 голос
/ 13 января 2020

Я хотел бы создать набор изображений, одно в зависимости от другого. Например, я хотел бы создать образ A, содержащий исходный код и SDK, выполняя сборку. Затем я хотел бы создать образ B, содержащий среды выполнения и некоторые двоичные файлы, полученные с компьютера A, для запуска пользовательского интерфейса веб-приложения. Наконец, я хотел бы создать образ C, содержащий среды выполнения и некоторые двоичные файлы, полученные (снова) с компьютера A, для запуска административных команд для веб-приложения.

Подводя итог, вот что я хотел бы do:

  • Создать машину А; скопировать исходные файлы с хоста на машину A, выполнить сборку
  • Создать машину B; копировать файлы (двоичные файлы) с машины A на машину B
  • Создать машину C; копировать файлы (двоичные файлы) с машины A на машину C
  • выбросить машину A прочь
  • запустить машину B
  • запустить машину C

В такой ситуации я должен иметь возможность создать машину A из файла Docker и присвоить ей имя и тег; затем мне нужно сослаться на него из других файлов Docker.

Я попытался указать имя и тег изображения в docker -компонентном файле: image: myRepo / imageA: Images.A

Только я не могу получить его из файлов Docker B и C. Нужно ли мне строить машину репо и хранить на ней машину А? Разве нельзя избежать этого шага?

1 Ответ

1 голос
/ 13 января 2020

Разметка, которую вы описываете, является разумной, но она не может быть напрямую выражена как Docker Compose. (У него нет никакого способа express изображений, которые не прикреплены к запущенным контейнерам, или express зависимостей между различными сборками изображений.) Вам нужно будет вручную перестроить базовый образ, когда вам нужно

docker build -f Dockerfile.sdk -t image-a .

Ваши другие файлы Docker могут начинаться с

FROM image-a

Нет особой необходимости помещать это sh это изображение в хранилище, если вы правильно создали и пометили изображение и его существует локально, вы можете запустить другой Dockerfile FROM изображение.

А затем вы можете docker-compose up --build как обычно.

Вы можете «научить» Docker Составить это, но только добавление дополнительной службы, которую вы не ожидаете запустить.

services:
  a:
    build:
      context: .
      dockerfile: Dockerfile.sdk
    image: image-a
    command: /bin/true  # exit immediately

Документация docker-compose build не содержит никаких указаний относительно встроенных контейнеров заказов (или даже если они ' гарантированно будет создаваться последовательно), поэтому вам снова нужно будет создать его вручную

docker-compose build a
docker-compose up --build

Стоит также подумать о том, нужны ли вам отдельные изображения "приложения" и "инструментов". Моя интуиция заключается в том, что в большинстве изображений размер базового изображения и времени выполнения языка значительно больше, чем размер приложения и особенно одной точки входа в приложение. Если одно изображение с парой дополнительных небольших команд инструментов соответствует вашим потребностям, то то, что вы описываете, является очень типичным использованием многоступенчатой ​​сборки . Для запуска команды инструмента вы можете либо docker-compose run одну из служб, объявленных в вашем файле docker-compose.yml с альтернативной командой, либо указать как build:, так и целевое image: имя в docker-compose.yml и docker run полученное изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...