Докер сохраняет / загружает потерянное хранилище оригинальных изображений / имя / тег

Я использую докер 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

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

Ссылка

Это работа вокруг

  1. Перейдите на исходный хост-компьютер докеров, создайте текстовый файл, содержащий все детали изображения, используя следующую команду docker image ls > images.txt

  2. Приведенная выше команда создаст текстовый файл, подобный следующему REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 293e4ed402ba 2 weeks ago 315MB <none> <none> d8e4b0afd6ba 2 weeks ago 551MB

  3. Внесите необходимые изменения, чтобы установить тег, используя 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 находятся.

Другие вопросы по тегам