Как развернуть самосборный образ Docker, чтобы внести изменения в себя по отношению к локальной среде?

Вкратце, docker служит способом написания кода или изменений файла конфигурации для конкретной веб-службы, среды выполнения, виртуальных машин, и все это в удобных пределах терминала/текстового файла Linux. Образы Docker — это точки сохранения слоев кода, которые создаются либо из файлов докеров, либо могут быть созданы из контейнеров, для создания которых в любом случае требуется базовый образ. Файлы Docker служат способом автоматизации процесса сборки образов путем выполнения всех необходимых команд и действий для любых новых контейнеров, которые будут созданы вместе с ним, и объединения их в один файл.

Теперь это здорово и все такое, но я хочу сделать еще один шаг вперед. Создание образов, особенно с зависимостями, обременительно, потому что 1 вам приходится полагаться на команды, которых либо нет в образе ОС по умолчанию, либо 2 есть много других бесполезных команд, которые не нужны.

Теперь в моей голове я чувствую, что это возможно, но я пока не могу установить связь. Я хочу, чтобы файл dockerfile собирался с нуля (буквально образ с нуля) и строился в соответствии с ним. Он заключается в том, чтобы скопировать любые необходимые зависимости, например, rpm или что-то в этом роде, установить его, найти его команду запуска и передать все зависимости, необходимые для успешного создания и запуска образа без ошибок, обратно в файл докера. В смысле программирования

FROM scratch
COPY package.rpm
RUN *desired cmds*

Ошибки выполнения возвращаются в файл. file ищет в текущей ОС необходимые зависимости и возвращает их команде RUN.

CMD *service start up*

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

Проблема здесь в том, что я не верю, что могу использовать докер для этих целей. Сделать докер-сборку чего-то, сохранить ошибки и отфильтровать их обратно в сборку снова кажется сложной задачей. Я бы хотел, чтобы docker был оснащен этим, поскольку, похоже, мой единственный шанс выполнить такую ​​​​задачу — это сценарий, который наносит ущерб фактору переносимости.

Любые идеи?


person Jouster500    schedule 27.07.2015    source источник
comment
В некотором смысле я хочу автоматизировать автоматическую сборку файлов докеров.   -  person Jouster500    schedule 27.07.2015
comment
Я знаю, что я мог бы сделать, но это потребует некоторой подготовительной работы. Сначала мне, возможно, придется выполнить минимальную установку машины, на которой я хочу создавать образы. Это означало бы просто наличие терминала на конкретной виртуальной машине. Используя эту минимальную установку, я мог бы обратить процесс вспять, удалив все ненужные команды, но мне все равно пришлось бы просеивать пакет, чтобы выяснить, что ему нужно... Мне сказали, что легче создать, чем уничтожить, но теперь я не так уверен. Я знаю, что в файле докеров я могу запускать определенные команды, но как узнать, какие команды нужны для всей службы?   -  person Jouster500    schedule 31.07.2015


Ответы (2)


Docker не собирается предлагать вам безболезненные сборки. Докер не знает, чего вы хотите.

Здесь у вас есть несколько вариантов:

  • Kitematic для OSX https://kitematic.com/ (у них также есть альфа-версия для Windows здесь https://github.com/kitematic/kitematic/releases). Вы используете это приложение для загрузки контейнеров, в которые другие вложили работу в интерфейсе GUI.

  • Докер композиций. Docker Compose позволяет использовать файлы конфигурации YAML для загрузки контейнеров Docker. Если вы хотите увидеть некоторые примеры этого представления, это репозиторий: https://github.com/b00giZm/docker-compose-nodejs-examples

Простой пример:

web:
build: .
volumes:
   - "app:/src/app"
ports:
   - "3030:3000"

Чтобы использовать его:

docker-compose up

Затем Docker compose будет:

  1. Вызов контейнера web
  2. построить, используя текущий рабочий каталог как root
  3. Подключить каталог app к каталогу /src/app в контейнере
  4. Выставляйте контейнерный порт 3030 как 3000 для внешнего мира.

Обратите внимание, что build также может указывать на контейнер Docker, который вы нашли с помощью Kitematic (который читается из реестра.hub.docker.com), поэтому вы можете заменить . (в приведенном выше примере в строке сборки) на node:latest, и он создаст NodeJS. контейнер.

Docker Compose очень похож на командную строку docker. Вы можете использовать https://lorry.io/ для создания файлов docker-compose.yml.

  • Если вы ищете эпическое решение, я бы порекомендовал что-то вроде Mesosphere для корпоративной среды Docker.

Есть и другие решения, которые вы также можете изучить, такие как Google Kubernetes и Apache Mesos, но кривая обучения будет увеличиваться.

Я также заметил, что вы возитесь с IP-адресами, и, хотя я не использовал их, из того, что я слышал, Weave значительно упрощает сетевой аспект Docker, что определенно не является сильной стороной Docker.

person taco    schedule 28.07.2015
comment
Я изучал кайтатик. Это более приятная форма уже существующего демона Docker, в котором он предоставляет графический интерфейс для взаимодействия пользователей. Гораздо лучший вариант для управления докером. Docker compose также относится к тому же формату. Более удобный инструмент для управления огромным количеством док-контейнеров, но, боюсь, я не стремился к этому. Я стремился к образу, который при попытке сборки распознает, что не может найти определенный файл, необходимый для использования команды запуска. Он передает эту зависимость обратно на компьютер, где может найти ее и добавить в файл докера. - person Jouster500; 28.07.2015
comment
Это не то, как это делают корпоративные компании. Они автоматизируют сборки, а затем беспокоятся только в случае сбоя сборки. Вы понимаете, что докер — это, по сути, просто архив, верно? Вы говорите, что хотите автоматизировать простую автоматизацию копирования файлов. Человек должен быть где-то в процессе. На вершине этого стека автоматизации всегда есть инженер. - person taco; 28.07.2015
comment
человек против машины. Человек делает машину, машине дана способность копировать себя. Знаете ли вы, что существует вирус, который может полностью переписать свой код, находясь в полевых условиях? Если кто-то может сделать что-то столь же сложное, кто-то также должен быть в состоянии создать скрипт или что-то, что может прикрепить необходимые зависимости к файлу докеров. У меня уже есть базовый вариант. Берет код ошибки сбойного файла dockerfile, выполняет поиск пути к файлу, копирует этот путь в новый файл dockerfile, пытается создать этот файл dockerfile, извлекает из него зависимости и так далее. - person Jouster500; 29.07.2015
comment
Единственным недостатком этого является то, что он используется в сценарии, основанном на условиях операционной системы, в которой он был создан. Вот почему я спрашиваю, есть ли что-то или какой-то метод, который может воспроизвести это и при этом быть переносимым во все среды. - person Jouster500; 29.07.2015
comment
Похоже, вы хотите написать его на Java, поэтому ваш инструмент, который запускает команды Docker, является кроссплатформенным для основных ОС. Я не знаю, почему бы вам просто не построить для одной ОС. Похоже на пустую трату времени и энергии, которые можно было бы направить на что-то другое. - person taco; 09.08.2015
comment
вы знаете, вы, вероятно, правы. Когда все сводится к этому, иметь что-то, что находится всего на 1 машине, для поиска зависимостей конкретного приложения. я надеялся, что есть какой-то способ сделать это, чтобы он был универсальным почти для всех дистрибутивов Linux, потому что я уверен, что есть некоторые программы, которые нельзя запускать на чем-то вроде Centos из-за некоторых проблем с зависимостями. И Java просто может быть ответом. Это один из тех языков, которые поддерживаются на каждой платформе. ИДК, возможно, мне придется посмотреть позже, чтобы сказать, насколько это экономически эффективно. - person Jouster500; 10.08.2015
comment
Я думал об этом сегодня, и, может быть, вы могли бы просто заставить его свернуть API-сервер. Здесь вы можете многое сделать: например, разгрузить некоторые тесты на сервер API. Возможно, он загрузит последний скрипт сборки, работа которого проверена инструментом непрерывной интеграции. - person taco; 10.08.2015
comment
Попытаюсь изучить это в ближайшие недели. Потому что это звучит как одна из моих предыдущих идей о том, чтобы программа могла общаться с чем-то еще для обработки входящих запросов. Подобно тому, как запрос вывода сборки докера передается другому приложению, которое пытается определить, где можно найти его зависимости. - person Jouster500; 10.08.2015

Для меня это больше похоже на систему снабжения а-ля ansible, шеф-повар или марионетка. Я знаю, что некоторые используют их для создания образов, если вам нужно остаться в докерландии.

person Mykola Gurov    schedule 28.07.2015
comment
Я думал, что мне, возможно, придется сделать что-то подобное. Я еще не разбирался в их языках, поэтому я просто хочу перепроверить и спросить еще раз, чтобы убедиться. Поэтому, используя файл dockerfile для попытки создать образ, он видит, что не может выполнить команду, поэтому возвращается в локальную систему, находит эту команду и передает ее обратно в файл docker, на основе которого он будет продолжать сборку до тех пор, пока для запуска пакета больше не нужны файлы? И вы думаете, что что-то вроде шеф-повара или марионетки подойдет? - person Jouster500; 28.07.2015