#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.
Комментарии:
1. «FROM может появляться несколько раз в одном файле Dockerfile для создания нескольких изображений. — …по вашей ссылке. Таким образом, он не объединяет изображения, а вместо этого создает несколько изображений