Докер: Объединение нескольких изображений

#docker #dockerfile

Вопрос:

Возможно ли с помощью Docker объединить два изображения в одно?

Вот так вот:

 genericA --
            
             ---> specificAB
            /
genericB --
 

Например, есть изображение для Java и изображение для MySQL.

Я хотел бы иметь изображение с Java и MySQL.

Ответ №1:

Нет, вы можете наследовать только от одного изображения.

Вы, вероятно, не хотите, чтобы Java и MySQL были в одном образе, так как более идиоматично иметь один компонент в контейнере, т. Е. Создать отдельный контейнер MySQL и связать его с контейнером Java, а не помещать оба в один контейнер.

Однако, если вам действительно нужно, чтобы они были в одном образе, напишите файл Dockerfile с Java в качестве базового образа (оператор FROM) и установите MySQL в файл Dockerfile. Вы должны иметь возможность в значительной степени копировать заявления из официального файла MySQL Dockerfile.

Комментарии:

1. Спасибо вам за ваш ответ. Поскольку я очень новичок в Docker (я установил его 3 часа назад 😉 быстрый последующий вопрос: Зачем мне нужны файлы Dockerfiles? Не могу ли я просто создать, не знаю, как это называется в «терминах докера», снимок(?) контейнера Java, А затем вручную установить в него MySQL (с apt-get и т. Д.)?

2. Вы можете сделать это с помощью «фиксации докера». Проблема в том, что это невозможно повторить, поэтому, если вы хотите что-то изменить, вам придется начинать все сначала. Файлы докеров — это определенно правильный путь.

3. Хорошо, что Java и mysql должны находиться в отдельных докерах, но это не всегда так, и проблема все еще остается, например, я мог бы захотеть установить nginx python, оба из которых имеют 2 изображения. Ваше решение — это просто обходной путь для шаблона наследования алмазов.

Ответ №2:

Docker напрямую не поддерживает это, но вы можете использовать DockerMake (полное раскрытие: я написал это) для управления такого рода «наследованием». Он использует файл YAML для настройки отдельных фрагментов образа, а затем управляет сборкой, генерируя соответствующие файлы Dockerfiles.

Вот как бы вы построили этот немного более сложный пример:

                                      --> genericA --
                                    /                
      debian:jessie -->  customBase                   ---> specificAB
                                                    /
                                      --> genericB --
 

Вы бы использовали этот DockerMake.yml файл:

 specificAB:
  requires:
    - genericA
    - genericB

genericA:
  requires:
     - customBase
  build_directory: [some local directory]
  build: |
    #Dockerfile commands go here, such as
    ADD installA.sh
    RUN ./installA.sh

genericB:
  requires:
    - customBase
  build: |
    #Here are some other commands you could run
    RUN apt-get install -y genericB
    ENV PATH=$PATH:something

customBase:
  FROM: debian:jessie
  build: |
    RUN apt-get update amp;amp; apt-get install -y buildessentials
 

После установки docker-make инструмента CLI ( pip install dockermake ) вы можете создать specificAB образ, просто запустив

 docker-make specificAB
 

Ответ №3:

Если вы это сделаете docker commit , то будет неудобно видеть, какие команды использовались для создания вашего контейнера, вам придется выдать docker history image

Если у вас есть файл Dockerfile, просто посмотрите на него, и вы увидите, как он был создан и что в нем содержится.

Фиксация докера выполняется «вручную», поэтому подвержена ошибкам, docker build поэтому использование файла докера, который работает, намного лучше.

Ответ №4:

Вы можете поместить несколько FROM команд в один файл Dockerfile.

https://docs.docker.com/reference/builder/#from

Комментарии:

1. «FROM может появляться несколько раз в одном файле Dockerfile для создания нескольких изображений. — …по вашей ссылке. Таким образом, он не объединяет изображения, а вместо этого создает несколько изображений