Экспорт и импорт в Docker: разница docker save/load и docker export/import
- После
docker importконтейнер не запускается с ошибкойno command specifiedили теряет переменные окружения. - Необходимость переноса Docker-образов в закрытые контуры (Air-Gapped окружения) без прямого доступа к Docker Registry.
- Потребность в сглаживании (Flattening) всех слоев контейнера в один для уменьшения размера и скрытия истории сборки.
1. Различия команд: Сравнительная таблица
| Критерий | docker save / load | docker export / import |
|---|---|---|
| Объект работы | Docker Image (образ) | Docker Container (запущенный/остановленный) |
| История слоев | Сохраняет все слои и кэш | Схлопывает (flatten) в один слой |
| Метаданные (CMD, ENV) | Полностью сохраняются | Сбрасываются (требуется ручной ввод) |
2. Сценарий 1: Перенос образов в закрытый контур (docker save / load)
# Сохранение образа со всеми слоями и тегами в архив
docker save my_app:v1.0 postgres:15-alpine | gzip > app_bundle.tar.gz
# Загрузка архива на целевом сервере
gunzip -c app_bundle.tar.gz | docker load3. Сценарий 2: Схлопывание слоев контейнера (docker export / import)
# Экспорт файловой системы запущенного контейнера
docker export my_container > container_fs.tar
# Импорт с восстановлением метаданных ENTRYPOINT и CMD
docker import \
--change "ENV PATH=/usr/local/bin:/usr/bin:/bin" \
--change "ENTRYPOINT [\"/app/entrypoint.sh\"]" \
--change "CMD [\"start\"]" \
container_fs.tar my_flattened_image:v1 Частые вопросы (FAQ)
Почему docker import создает образ, который не запускается по умолчанию?
docker export экспортирует только «слепок» файловой системы контейнера, отсекая метаданные манифеста (CMD, ENTRYPOINT, EXPOSE, ENV). При импорте их необходимо заново объявлять через флаг --change.
Можно ли сохранить сразу несколько образов в один tar-архив?
Да, команда docker save image1:tag image2:tag -o multi.tar сохраняет несколько образов и их общие базовые слои в один архив.