Вопрос или проблема
На моей старой машине с Ubuntu 16.04 есть следующий образ Docker:
sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php53s latest c8a8315b4970 7 years ago 280MB
Я скопировал этот образ на новую машину с Ubuntu 22.04 с помощью следующих команд:
# Старая машина:
sudo docker save -o php53-image.tar c8a8315b4970
# Новая машина:
sudo docker load -i php53-image.tar
и даже смог запустить его по новому id образа, но на новой машине образ отображается без репозитория/тега:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> c8a8315b4970 7 years ago 280MB
Как присвоить репозиторий/тег новому образу?
Ответ или решение
Когда вы переносите Docker-образ с одной машины на другую с использованием команды docker save
и затем docker load
, иногда теряются метаданные, такие как имя репозитория и теги. Это может стать источником путаницы, когда вы видите в списке загруженных образов <none>
для репозитория и тега. Давайте рассмотрим это подробнее.
Теория
Docker хранит образы в локальном хранилище каждой машины. Когда вы создаете образ, он получает уникальный идентификатор (IMAGE ID) и метаданные, такие как репозиторий и теги (например, latest
). Эти метаданные позволяют легко идентифицировать и управлять образами, особенно когда на машине находится несколько образов разных версий.
Команда docker save
экспортирует образ в tar-архив, содержащий слои образа и метаданные. Однако, когда вы загружаете этот архив командой docker load
, репозиторий и теги могут не загрузиться, что приводит к отображению <none>
в команде docker images
.
Пример
В вашем случае на старой машине Ubuntu 16.04 образ имел репозиторий php53s
и тег latest
. Вы создали архив этого образа с помощью команды:
sudo docker save -o php53-image.tar c8a8315b4970
После переноса архива на новую машину Ubuntu 22.04 вы его загрузили:
sudo docker load -i php53-image.tar
Однако, при проверке доступных образов с помощью команды docker images
, вместо ожидаемого репозитория и тега вы увидели следующее:
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> c8a8315b4970 7 years ago 280MB
Применение
Чтобы вручную присвоить репозиторий и тег загруженному образу, используйте команду docker tag
. Эта команда позволяет добавить новые метаданные к образу. Вот как можно это сделать:
-
Найдите IMAGE ID загруженного образа. В вашем случае это
c8a8315b4970
. -
Присвойте новый репозиторий и тег. Например, если вы хотите восстановить оригинальный репозиторий
php53s
и тегlatest
, выполните команду:sudo docker tag c8a8315b4970 php53s:latest
Теперь, если вы снова выполните docker images
, должно отображаться следующее:
REPOSITORY TAG IMAGE ID CREATED SIZE
php53s latest c8a8315b4970 7 years ago 280MB
Таким образом вы сможете управлять образом на новой машине так же, как и на старой, используя метаданные для организации и запуска контейнеров.
Общие рекомендации
-
Сохранение метаданных: Чтобы сохранить репозиторий и теги при переносе, можно не только использовать
docker save
, но и задействовать регистры образов как центральное хранилище, например, Docker Hub или локальный Docker Registry. -
Автоматизация: В случае, если необходимо часто переносить образы между машинами, разработайте скрипты, которые не только сохранят и загрузят образы, но и автоматически назначат нужные репозитории и теги.
-
Документация: Ведите документацию для хранимых образов, чтобы всегда иметь под рукой информацию об их назначении и использовании.
Следуя данным рекомендациям и используя приведенные команды, вы сможете эффективно управлять Docker-образами, сохраняя организацию и порядок при переносе их между различными системами.