Докер сохраняет / загружает потерянное хранилище оригинальных изображений / имя / тег
Я использую докер 1.12.6.
Я вытащил изображение из реестра докеров.
Я экспортировал изображения как файл tar с помощью docker save
команда.
Я удалил исходное изображение и контейнер и загрузил экспортированное изображение, используя docker load -i myImage.tar
,
Теперь, когда работает docker images
Я заметил, что мое изображение потеряло информацию о репозитории / тегах:
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 5fae4d4b9e02 8 weeks ago 581.3 MB
Почему это поведение и как сохранить исходное имя изображения?
Спасибо
8 ответов
Я столкнулся с той же проблемой, и я понял, что это произошло из-за команды docker save. Если я использую команду "docker save" с "imageid", то при загрузке изображения я потеряю имя репозитория и тега. Пример:
docker save -o ubuntu-18.04.tar ea4
Но если я использую команду "docker save" с "repo:tag", я смогу сохранить свой репозиторий и имя тега при загрузке изображения. Пример:
docker save -o ubutu-18.04.tar ubuntu:18.04
У меня была такая же проблема, поэтому я использовал следующую команду, чтобы исправить ее вручную:
docker tag <Image-ID> <desired Name:Tag>
[ПРИМЕЧАНИЕ]:
Это противоречиво:
docker save image-repo-name
->docker load
восстанавливает имя,docker save SHA
->docker load
нет имен или тегов,docker save name:latest
->docker load
нет имен или тегов.
И:
Текущее (и правильное) поведение выглядит следующим образом:
docker save repo
Сохраняет все помеченные изображения + родителей в репо и создает файл репозитория, в котором перечислены теги
docker save repo:tag
Сохраняет помеченное изображение + родителей в репо и создает файл репозитория, содержащий тег
docker save imageid
Сохраняет изображение + родителей, не создает файл репозитория. Сохранение относится только к изображению, а теги не учитываются в дизайне и оставляются пользователю как упражнение для заполнения на основе собственного соглашения об именах.
Это работа вокруг
Перейдите на исходный хост-компьютер докеров, создайте текстовый файл, содержащий все детали изображения, используя следующую команду
docker image ls > images.txt
Приведенная выше команда создаст текстовый файл, подобный следующему
REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 293e4ed402ba 2 weeks ago 315MB <none> <none> d8e4b0afd6ba 2 weeks ago 551MB
Внесите необходимые изменения, чтобы установить тег, используя
docker image tag
команда
docker image tag 293e4ed402ba postgres:latest
docker image tag d8e4b0afd6ba wordpress:latest
Один идентификатор изображения может иметь несколько имен / тегов, поэтому я могу ожидать, что вы потеряете имена и теги после сохранения и загрузки изображения в / из tar-шара.
Детали режима находятся в обсуждении об этом здесь
Из документации докеров:
кот exampleimage.tgz | импорт докеров - exampleimagelocal: новое
root@mymachine:/tmp# cat myimage.tar | docker import --message "New image imported from tarball" - reponame:my-image-name
sha256:be0794427222dcb81182a59c4664b350ecb5ffb7b37928d52d72b31
root@mymachine:/tmp# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
reponame my-image-name be0794427222 6 seconds ago 4.31GB
Этот сработал для меня.
Чтобы автоматизировать эту процедуру, убедитесь, что вы сделали копию вывода изображений Docker, прежде чем:
docker images >images.txt
Затем, после загрузки всех изображений, сделайте что-то вроде этого:
cat images.txt | sed '1d' | awk '{print "docker tag "$3" "$1":"$2}' | /bin/bash
Если у вас есть изображения с тегом as, вам необходимо сначала отредактировать images.txt, чтобы пропустить их, и/или сделать это вручную.
function docker_image_export(){
docker images | grep -v REPOSITORY | while read line
do
# filename:
# <repo>:<version>:<image_id>.tar , replace:
# / --> +
# : --> @
# after replace: <repo>@<version>@<image_id>.tar
local filename=$( echo $line | awk '{print $1":"$2":"$3".tar"}' | sed 's|:|@|g ; s|/|+|g' )
image_id=$( echo $line | awk '{print $3}' )
echo "docker save $image_id -o ${filename}"
docker save $image_id -o ${filename}
done
}
# For example:
# docker save 4f41f23e6002 -o mcr.microsoft.com+powershell@latest@4f41f23e6002.tar
# docker save 9c7a54a9a43c -o hello-world@latest@9c7a54a9a43c.tar
# docker save cc44224bfe20 -o nginx@alpine@cc44224bfe20.tar
# docker save f9e320b7e19c -o rancher+rancher@latest@f9e320b7e19c.tar
function docker_image_import(){
ls *@*.tar | while read line
do
# phase filename
# delete .tar # mcr.microsoft.com+powershell@latest@4f41f23e6002.tar --> mcr.microsoft.com+powershell@latest@4f41f23e6002
local filename=${line/.tar/}
image_id=${filename##*@}
# delete @4f41f23e6002 # mcr.microsoft.com+powershell@latest@4f41f23e6002 --> mcr.microsoft.com+powershell@latest
filename=${filename/@$image_id/}
local version=${filename##*@}
# delete @latest # mcr.microsoft.com+powershell@latest --> mcr.microsoft.com+powershell
local repo=${filename/@$version/}
# replace + --> / # mcr.microsoft.com+powershell --> mcr.microsoft.com/powershell
repo=$( echo ${repo} | sed 's|+|/|g' )
echo "docker import ${line}"
docker import ${line}
docker tag ${image_id} "${repo}:${version}"
echo "docker tag ${image_id} $repo:$version"
done
}
# docker import hello-world@latest@9c7a54a9a43c.tar
# docker tag 9c7a54a9a43c hello-world:latest
# docker import mcr.microsoft.com+powershell@latest@4f41f23e6002.tar
# docker tag 4f41f23e6002 mcr.microsoft.com/powershell:latest
# docker import nginx@alpine@cc44224bfe20.tar
# docker tag cc44224bfe20 nginx:alpine
# docker import rancher+rancher@latest@f9e320b7e19c.tar
# docker tag f9e320b7e19c rancher/rancher:latest
Я написал однострочный скрипт, который импортирует кучу файлов .tar и сразу же добавляет теги к изображению.
for image in $(ls); do docker tag "$(echo $(docker import $image))" $image ; done
Обратите внимание, что вы должны находиться внутри папки, когда все файлы tar находятся.