Поиск по сайту:

Как создать образ Docker из работающего контейнера


Контейнеры Docker обычно представляют собой эфемерные экземпляры приложений, в которых отсутствует внутреннее состояние. Это лучший способ справиться с ними, который позволяет вам останавливать или перезапускать контейнеры в любое время.

Однако иногда изменения файловой системы контейнера неизбежны. Возможно, вы тестируете программное обеспечение и хотите вернуться к снимку позже. Другим вариантом использования могут быть ситуации, когда программное обеспечение внутри контейнера перестало работать, и вы хотите сохранить реплику, которую вы можете отлаживать в будущем.

Вот как создать новый образ Docker из существующего контейнера. Затем вы сможете запустить другой контейнер из этого образа, который будет заполнен файловой системой из первого.

Отправка контейнеров

Команда docker commit используется для получения контейнера и создания из него нового образа. Он работает как с остановленными, так и с запущенными контейнерами.

Основной синтаксис следующий:

docker commit example-container example-image:latest

Это создает изображение из контейнера с именем example-container. Вы также можете идентифицировать контейнер по идентификатору, если хотите. Обе части информации доступны из вывода docker ps, в котором перечислены все контейнеры на вашем хосте.

Полученному изображению присваивается тег, заданный вторым параметром команды. Это example-image:latest в приведенном выше примере. Как и при обычной операции тегирования изображения, новое изображение заменит ссылку тега, если она уже существует.

Теперь вы можете использовать свой образ для восстановления файловой системы из example-container в новый экземпляр контейнера:

docker run -d example-image:latest

Содержимое файловой системы будет соответствовать контейнеру example-container на момент выполнения команды docker commit. Есть одно важное предостережение: содержимое смонтированных томов не будет включено, поэтому их места монтирования будут пустыми в созданном образе контейнера. Чтобы запустить новый контейнер с неповрежденными данными тома, используйте флаг -v для повторного подключения томов из первого контейнера при запуске второго экземпляра с помощью docker run.

Еще одним заслуживающим внимания камнем преткновения является то, как Docker обрабатывает коммиты запущенных контейнеров. По большей части это должно работать без проблем, но по умолчанию целевой контейнер приостанавливается до создания коммита. Все процессы внутри контейнера будут приостановлены, а затем возобновлены после завершения создания образа. Это улучшает согласованность данных в новом образе, но временно оставляет контейнер недоступным. Вы можете отключить это поведение, включив --pause false в команду docker commit.

Добавление сообщений фиксации

Команда docker commit поддерживает сообщения фиксации так же, как и программное обеспечение для контроля версий, такое как Git. Добавление сообщения при создании образа из контейнера позволяет документировать изменения и причины вашей фиксации.

Используйте флаг --message или -m, чтобы применить сообщение фиксации:

docker commit -m "Example commit" example-container example-image:latest

Вы также можете добавить информацию об авторстве с помощью специального флага. Укажите строку в общем формате First Name для флага --author или -a. Он будет сохранен вместе с сообщением фиксации.

docker commit -a "Example Author <example@example.com>" -m "Example commit" example-container example-image:latest

Сообщения фиксации отображаются, когда вы используете команду docker history для просмотра слоев в изображении. Они будут отображаться в столбце COMMENT справа.

Другой способ получить доступ к этой информации — использовать docker inspect в тандеме с grep для извлечения значений авторства и комментариев из JSON-представления изображения:

docker inspect <image-id> | grep 'Created|Author|Comment'

Это покажет данные, связанные с самым верхним слоем изображения.

Изменение инструкций Dockerfile

Отправка образа дает вам возможность изменить некоторые инструкции Dockerfile. В новом изображении вы можете переопределить следующие значения:

  • CMD
  • ВХОД
  • ENV
  • ЭКСПОЗИЦИЯ
  • ЭТИКЕТКА
  • НАСТРОЙКА
  • ПОЛЬЗОВАТЕЛЬ
  • ОБЪЕМ
  • РАБОЧИЙКАТАЛОГ

Чтобы установить инструкцию, используйте флаг --change или -c:

docker commit --change 'ENTRYPOINT ["sh"]' example-container example-image:latest

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

Поддерживаются только инструкции, влияющие на самый верхний уровень файловой системы. Вы не можете плавно расширить готовый образ новыми слоями с помощью таких инструкций, как RUN и COPY. Однако вы можете взять результат коммита и написать новый Dockerfile, который при необходимости добавляет новый контент:

# Created via `docker commit`
FROM example-image:latest
RUN apt install example-package

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

Краткое содержание

Образы Docker обычно создаются из файлов Dockerfile и используются для запуска одноразовых контейнеров. Изменения состояния файловой системы контейнера вносятся путем перестроения образа, уничтожения существующего контейнера и запуска нового. В идеальном мире контейнеры не имеют никакого внутреннего состояния, но на практике это не всегда так.

Фиксация контейнера дает вам возможность восстановить его текущую файловую систему в будущем. Коммиты полезны для создания реплик проблемных контейнеров, поэтому вы можете выполнять отладку в отдельной среде, сохраняя при этом доступ к ранее созданным журналам и временным файлам.

Хотя коммиты контейнеров часто кажутся похожими на моментальные снимки виртуальной машины, это не совсем одно и то же. Виртуальные машины управляют виртуальным оборудованием, и состояние этого оборудования будет отображаться в моментальном снимке. Контейнеры Docker — это просто набор процессов, запущенных на хосте; коммит — это новый образ Docker, представляющий файловую систему контейнера, но в котором обязательно отсутствуют какие-либо данные о состоянии процессов, ядра и вашего оборудования.