Гид по технологиям

Создать Docker-образ из контейнера

6 min read Docker Обновлено 01 Dec 2025
Создать Docker-образ из контейнера
Создать Docker-образ из контейнера

Схема процесса создания Docker-образа из контейнера

TL;DR

Создание Docker-образа из существующего контейнера позволяет сохранить текущий файловый слой контейнера как новый образ. Это удобно для диагностики, коробочных снимков состояния приложения или когда нужно сохранить временные данные. Учтите, что тома (volumes) и состояние процессов не включаются в образ, поэтому такой снимок не равен VM-снимку.

Быстрые ссылки

  • Добавление сообщений коммита
  • Изменение инструкций Dockerfile
  • Краткое резюме

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

Ниже подробная инструкция, какие ограничения и альтернативы учитывать, а также практические чек-листы для разработчика, оператора и тестировщика.

Команда docker commit — что делает и как работает

Команда docker commit берёт контейнер и создаёт новый образ на основе его текущего файлового слоя. Команда работает с контейнерами в любых состояниях: остановленными или запущенными.

Базовый синтаксис:

docker commit example-container example-image:latest

Эта команда создаст образ из контейнера с именем example-container. При желании вместо имени можно использовать ID контейнера — его можно получить через docker ps.

Тег, который вы укажете в качестве второго параметра, будет присвоен новому образу. Если такой тег уже существует, ссылка будет перезаписана.

После создания образа вы можете запустить новый контейнер, который будет содержать тот же файловый слой, что и исходный контейнер на момент коммита:

docker run -d example-image:latest

Важно: содержимое подключённых томов (volumes) не попадает в образ. Места монтирования в новом контейнере будут пустыми. Если вам нужно запустить новый контейнер с теми же томами и их данными, повторно подключите томы при запуске второго контейнера, например с флагом -v или используя опции --volumes-from.

Ещё один нюанс — поведение с запущенными контейнерами. По умолчанию Docker временно приостанавливает (pauses) контейнер перед созданием образа, чтобы обеспечить консистентность данных. Это означает краткую недоступность контейнера на время коммита. Чтобы отменить пауза, используйте флаг --pause false:

docker commit --pause false example-container example-image:latest

Когда commit выполняется некорректно

  • Если в контейнере активно записываются данные, а вы не ставите паузу, образ может получиться неконсистентным.
  • Если важные данные хранятся в volumes, commit не сохранит их.

Добавление сообщения и автора коммита

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

Пример с сообщением:

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

Добавление автора:

docker commit -a 'Example Author ' -m 'Example commit' example-container example-image:latest

Сообщения и авторы будут видны в выводе docker history в колонке COMMENT для соответствующего слоя. Также можно получить значения из JSON-описания образа командой docker inspect и отфильтровать значения:

docker inspect  | grep 'Created\|Author\|Comment'

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

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

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

  • CMD
  • ENTRYPOINT
  • ENV
  • EXPOSE
  • LABEL
  • ONBUILD
  • USER
  • VOLUME
  • WORKDIR

Пример переопределения ENTRYPOINT:

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

Флаг --change (или -c) можно указывать несколько раз для применения нескольких правок.

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

Пример последовательности: создать образ через commit, затем написать Dockerfile, который основывается на только что созданном образе и добавляет нужные пакеты:

# Создано через `docker commit`
FROM example-image:latest

RUN apt-get update && apt-get install -y example-package

Если вы меняете инструкции при коммите, полезно добавить подробное сообщение коммита, чтобы понять, какие настройки были изменены и зачем.

Практические советы и чек-листы

Чек-лист для разработчика

  • Перед коммитом остановите приложение в контейнере или используйте --pause true для согласованности данных.
  • Проверьте, где лежат важные данные: если в томах — перенесите их во временное место внутри контейнера, если вам нужно сохранить их в образе.
  • Добавьте понятный -m и -a для истории.
  • Протестируйте образ локально: docker run --rm -it example-image:latest.

Чек-лист для оператора

  • Убедитесь, что теги не конфликтуют с продовыми образами.
  • Если образ нужно хранить в registry, выполните docker push после тестов.
  • Документируйте причины создания образа в системе инцидентов или трекере.

Чек-лист для QA

  • Запустите контейнер из созданного образа и воспроизведите баг-сценарий.
  • Проверьте логи и временные файлы — они должны соответствовать состоянию на момент коммита.
  • Убедитесь, что образ не содержит секретов и учётных данных.

Альтернативные подходы и когда не пользоваться docker commit

Альтернативы:

  • Пересобрать образ по Dockerfile — рекомендуемый подход для воспроизводимости.
  • Использовать CI/CD для сборки и подписывания образов.
  • Экспорт/импорт файловой системы (docker export / docker import) — полезно для плоского снимка контейнера без слоёв метаданных.
  • Использовать системные снимки уровня виртуальной машины, если нужен полноценный снимок состояния процессов и kernel.

Когда не использовать docker commit:

  • Когда нужен воспроизводимый процесс сборки и контроль версий над Dockerfile.
  • Когда данные находятся в volumes и их необходимо сохранить вместе с образом.
  • Когда требуется снимок состояния процессов, сетевых подключений или kernel.

Ментальные модели и быстрое понимание

  • commit = «снимок файловой системы контейнера» (только файловая система, без процессов и hardware state).
  • Dockerfile + docker build = «документируемая, воспроизводимая сборка».
  • volume = «вне образа» (данные, которые живут отдельно и не попадают в commit).

Мини-методология: безопасный workflow для создания образа из контейнера

  1. Зафиксируйте причину создания образа в тикете или заметке.
  2. Остановите критичные процессы в контейнере, если возможно.
  3. Если необходимо, внутрь контейнера скопируйте нужные файлы из volumes во временную папку.
  4. Выполните docker commit с сообщением и автором.
  5. Протестируйте локально образ.
  6. Если требуется, создайте Dockerfile от полученного образа и выполните docker build.
  7. Запушьте в registry и отразите изменения в документации.

Факт-бокс

  • Что сохраняется: файловая система верхнего слоя контейнера, метаданные (Author, Comment), инструкции, которые вы переопределили через --change.
  • Что не сохраняется: содержимое подключённых томов, состояние процессов, информация ядра и hardware.
  • Полезные команды: docker ps, docker inspect, docker history, docker run, docker push.

Шаблон: быстрая команда и пример сообщения

docker commit -a 'Ivan Ivanov ' -m 'Snapshot: reason=debugging, added /tmp/dump' example-container example-image:debug-2025-11-01

Замените example-container, example-image и метки на свои значения.

Пример сценариев использования

  • Отладка некорректного поведения приложения: создать образ и передать его инженерам поддержки.
  • Сохранение временных данных, если CI упал и нужно понять причину.
  • Быстрая упаковка изменений, сделанных вручную в контейнере для последующей автоматизации через Dockerfile.

Решение: ветвление действий (Mermaid)

flowchart TD
  A[Нужно сохранить состояние контейнера?] --> B{Данные в volumes?}
  B -- Да --> C[Рассмотрите экспорт томов или копирование данных внутрь контейнера]
  B -- Нет --> D{Нужна воспроизводимость?}
  D -- Да --> E[Пересобрать образ через Dockerfile]
  D -- Нет --> F[Использовать docker commit]
  F --> G[Протестировать образ и задокументировать]

Безопасность и конфиденциальность

  • Не коммитьте контейнеры с секретами или ключами в файловой системе. Перед коммитом выполните очистку чувствительных данных.
  • Если необходимо сохранить чувствительные логи, выгрузите их в безопасное хранилище с контролем доступа.

Критерии приёмки

  • Новый образ запускается и воспроизводит необходимое состояние приложения.
  • Все важные для диагностики файлы доступны в образе (если они не лежали в volumes).
  • Сообщение коммита и автор указаны и понятны коллегам.
  • Образ протестирован и либо удалён, либо зарегистрирован в registry по политике команды.

Короткое резюме

Команда docker commit удобна для быстрого создания образа из существующего контейнера, особенно в ситуациях отладки и восстановления. Однако это инструмент для оперативной работы, а не для организации воспроизводимой сборки. По возможности оформляйте постоянные изменения через Dockerfile и CI/CD.

Важное: commit сохраняет только файловый слой контейнера — тома и состояние процессов не входят в снимок.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство