У меня сейчас есть несколько Dockerfiles.
Один для Cassandra 3.5, и это FROM cassandra:3.5
У меня также есть Dockerfile для Kafka, но это немного сложнее. Это FROM java:openjdk-8-fre
и запускает длинную команду для установки Kafka и Zookeeper.
Наконец, у меня есть приложение, написанное на Scala, которое использует SBT.
Это для этого Dockerfile, FROM broadinstitute/scala-baseimage
который дает мне Java 8, Scala 2.11.7 и STB 0.13.9, что мне и нужно.
Возможно, я не понимаю, как работает Docker, но моя программа Scala имеет Cassandra и Kafka в качестве зависимостей, и для целей разработки я хочу, чтобы другие могли просто клонировать мое репо с помощью, Dockerfile
а затем иметь возможность создавать его с помощью Cassandra, Kafka , Scala, Java и SBT встроены, так что они могут просто скомпилировать исходный код. Хотя у меня с этим много проблем.
Как мне объединить эти Dockerfiles? Как мне просто создать среду из этих вещей?
источник
Ответы:
Вы можете с помощью функции многоэтапных сборок, представленной в Docker 1.17
Взгляните на это:
Затем создайте образ как обычно:
От: https://docs.docker.com/develop/develop-images/multistage-build/
источник
nvidia-docker
иrustlang/rust:nightly
. Эти изображения, в свою очередь, накладываются поверх других изображений. Чтобы сделать это с использованием многослойных сборок, я должен знать и указать все файлы из одного из изображений, которые я хочу скопировать на другое изображение - это кажется невозможным, особенно потому, что этот набор может изменяться всякий раз, когда изменяется исходное изображение. Я правильно читаю?FROM a/a:latest FROM b/b:latest COPY --from=0 / /
Наверное, ужасная практика, но она работает. Это было в основном из моего собственного любопытства, чем из того, что я использовал бы в производстве.FROM image1; CMD image1command; FROM image2; CMD image2command;
Это вообще не работает. Всегда только 2-я командаВы не можете комбинировать файлы докеров, так как могут возникнуть конфликты. Что вы хотите сделать, так это создать новый файл докеров или создать собственный образ.
TL; DR; Если ваш текущий контейнер разработки содержит все необходимые инструменты и работает, то сохраните его как изображение, а затем в репо и создайте файл докеров для извлечения из этого образа из репозитория.
Подробности: создание собственного образа намного проще, чем создание файла докеров с использованием общедоступного образа, поскольку вы можете хранить в образе любые хаки и моды. Для этого запустите пустой контейнер с базовым образом Linux (или broadinstitute / scala-baseimage), установите все необходимые инструменты и настройте их, пока все не будет работать правильно, а затем сохраните его (контейнер) как образ. Создайте новый контейнер из этого образа и проверьте, можете ли вы построить свой код поверх него с помощью docker-compose (или как вы хотите это сделать / построить). Если это работает, значит, у вас есть рабочий базовый образ, который вы можете загрузить в репо, чтобы другие могли его вытащить.
Чтобы создать файл докеров с общедоступным образом, вам нужно будет разместить все хаки, моды и настройки в самом файле докеров. То есть вам нужно будет поместить каждую используемую вами командную строку в текстовый файл и сократить количество хаков, модов и настроек до командных строк. В конце ваш dockerfile создаст образ автоматически, и вам не нужно хранить этот образ в репо, и все, что вам нужно сделать, это предоставить другим dockerfile, и они смогут развернуть образ в своем собственном докере.
Обратите внимание: если у вас есть рабочий файл докеров, вы можете легко настроить его, поскольку он будет создавать новый образ каждый раз, когда вы используете файл докеров. С настраиваемым образом вы можете столкнуться с проблемами, когда вам потребуется перестроить образ из-за конфликтов. Например, все ваши инструменты работают с openjdk, пока вы не установите тот, который не работает. Исправление может включать удаление openjdk и использование oracle one, но вся конфигурация, которую вы выполняли для всех установленных вами инструментов, сломалась.
источник
Следующий ответ относится к докеру 1.7 и выше:
Я бы предпочел использовать
--from=NAME
иfrom image as NAME
почему? Вы можете использовать--from=0
и выше, но это может быть немного сложно, если у вас много этапов докера в файле dockerfile.примерный пример:
Примечание. Правильное управление файлом dockerfile поможет быстрее создать образ докера. Внутренний докер использует кеширование уровня докера, чтобы помочь в этом процессе, на случай, если изображение придется перестраивать.
источник
Да, вы можете свернуть большое количество программного обеспечения в один образ Docker ( GitLab делает это с одним образом, который включает Postgres и все остальное), но в целом Генри прав - это не типичный способ использования Docker.
Как вы говорите, Cassandra и Kafka являются зависимостями для вашего приложения Scala, они не являются частью приложения, поэтому не все принадлежат одному образу.
Необходимость координировать множество контейнеров с помощью Docker Compose добавляет дополнительный уровень администрирования, но дает гораздо больше гибкости:
источник
Вы не могли объединить образы докеров в 1 контейнер. См. Подробное обсуждение в выпуске Moby, как объединить несколько изображений в один с помощью Dockerfile .
В вашем случае лучше не включать все изображения Cassandra и Kafka. Приложению потребуются только драйвер Cassandra Scala и драйвер Kafka Scala. Контейнер должен включать только драйверы.
источник
Docker не выполняет слияние образов, но ничто не мешает вам объединить файлы докеров, если они доступны, и превратить их в толстый образ, который вам нужно будет создать. Однако есть моменты, когда это имеет смысл, поскольку для запуска нескольких процессов в контейнере большинство догм Docker будет указывать на это как на менее желательное, особенно с архитектурой микросервисов (однако правила должны быть нарушены, верно?)
источник
Мне понадобились образы docker: latest и python: latest для Gitlab CI. Вот что я придумал:
После того, как я собрал и отправил его в репозиторий Docker Hub:
Не забудьте
docker login
перед нажатиемНадеюсь, поможет
источник