Я хочу создать образ докера для проекта Linkurious на github, для работы которого требуется как база данных Neo4j, так и Node.js.
Моим первым подходом было объявить базовое изображение для моего изображения, содержащее Neo4j. Справочные документы не определяют «базовое изображение» каким-либо полезным образом:
Базовое изображение: изображение, не имеющее родителя, является базовым.
из которого я прочитал, что у меня может быть только базовое изображение, если у этого изображения нет самого базового изображения.
а что такое базовый образ? Означает ли это, что если я объявлю neo4j / neo4j в директиве FROM, то при запуске моего образа база данных neo будет автоматически запускаться и будет доступна в контейнере на порту 7474?
читая ссылку на Docker (см .: https://docs.docker.com/reference/builder/#from ), я вижу:
FROM может появляться несколько раз в одном Dockerfile для создания нескольких образов. Просто запишите последний идентификатор изображения, выводимый коммитом перед каждой новой командой FROM.
я хочу создать несколько изображений? Казалось бы, я хочу иметь одно изображение, которое содержит содержимое других изображений, например neo4j и node.js
Я не нашел в справочном руководстве директивы для объявления зависимостей. Нет ли зависимостей, как в RPM, где для запуска моего изображения вызывающий контекст должен сначала установить нужные ему изображения?
Я запутался...
источник
FROM
файловDockerfile
. См. Мой отредактированный ответ ниже.Ответы:
Набор файлов, плюс
EXPOSE
d-портыENTRYPOINT
иCMD
.Вы можете добавлять файлы и создавать новый образ на основе этого базового образа с новым,
Dockerfile
начинающимся сFROM
директивы: изображение, упомянутое после,FROM
является «базовым изображением» для вашего нового образа.Только если не перезаписывать
CMD
иENTRYPOINT
.Но самого изображения достаточно: вы бы использовали,
FROM neo4j/neo4j
если бы вам нужно было добавить файлы, относящиеся кneo4j
вашему конкретному использованиюneo4j
.Не надо: есть предложение все равно убрать эту "фичу" ( issue 13026 )В выпуске 14412 упоминается:
Обновление май 2017 г. (18 месяцев спустя) с докером (моби) 17.05-ce .
Многократное FROM может использоваться в одном Dockerfile.
См. « Шаблон построителя против многоэтапных сборок в Docker » ( Алекс Эллис ) и PR 31257, автор Тынис Тийги .
Перед:
После:
Первая часть Dockerfile:
Вторая часть того же (!) Dockerfile:
В результате будут два изображения, одно для построения, другое только с конечным приложением ( намного меньше).
источник
Первый ответ, на мой взгляд, слишком сложен, историчен и малоинформативен.
На самом деле это довольно просто. Docker предоставляет функциональность, называемую многоэтапными сборками, основная идея здесь состоит в том, чтобы:
Начнем с первого. Очень часто с чем-то вроде Debian вы увидите.
Мы можем объяснить все это в терминах вышеизложенного. Вышеупомянутая команда связана вместе, поэтому она представляет собой одно изменение без промежуточных изображений. Если бы это было написано так,
Это приведет к появлению еще 3 временных промежуточных изображений. После сокращения до одного образа остается одна проблема:
apt-get clean
не очищаются артефакты, использованные при установке. Если сопровождающий Debian включает в свою установку сценарий, который изменяет систему, эта модификация также будет присутствовать в окончательном решении (см.pepperflashplugin-nonfree
Что- то подобное для примера).Используя многоступенчатую сборку, вы получаете все преимущества одного измененного действия, но для этого потребуется вручную внести в белый список и скопировать файлы, которые были добавлены во временный образ, с использованием
COPY --from
синтаксиса, описанного здесь. Более того, это отличное решение там, где нет альтернативы (напримерapt-get clean
), и в противном случае у вас будет много ненужных файлов в вашем конечном изображении.Смотрите также
источник
FROM
в основном это объявление пространства имен. Квалификатор здесь больше похож на расширение, чем на наследование. Вы можете объявить несколько пространств имен. И каждое из этих пространств имен может расширять одно другое пространство имен. @ekkis Если вам подходит другой ответ, то обязательно придерживайтесь его.