Docker превращает анонимный том в именованный том

Я опробовал образ docker с помощью командной строки docker без указания имен томов. Теперь я обнаружил, что хочу продолжать использовать этот контейнер / изображение, но путем определения контейнера в docker compose.

Что такое наилучшая практика для хранения данных из анонимных / неназванных томов и использования их в новом контейнере, созданном docker compose?

  • Могу ли я каким-то образом преобразовать неназванные тома в именованные?
  • или я должен создать новый контейнер с помощью docker compose с именованными томами и скопировать данные?
  • или какой-нибудь другой вариант?

Чтобы подвести итог обходной путь:

docker volume create --name <new_volume>docker run --rm -it -v <old_volume>:/from:ro -v <new_volume>:/to alpine \    ash -c "cd /from ; cp -av . /to"docker volume rm <old_volume>

Преимущество этого метода заключается в использовании docker API. Он использует облегченный образ Linux, называемый alpine и его оболочка по умолчанию, ash чтобы запустить копирование файла, cp -av от старого тома к новому названному тому.

В настоящее время вы не можете переименовать существующие тома. (Это верно независимо от того, были ли они ранее названы или были безымянными, и их имена были сгенерированы автоматически.)

Вы можете видеть этот вопрос для получения дополнительной информации о реализации этой функции, а также добавьте свой "+1" / "Большой палец вверх", чтобы сообщить разработчикам, что вы этого хотите.

Без этого, насколько я знаю, единственный хороший способ сделать это - создать новый именованный том и скопировать данные.

Ответ CivFan не сработал для меня как есть, поэтому я публикую свое решение здесь:

docker run --rm --volumes-from <container_name> -v <new_volume_name>:/to ubuntu bash -c "cd <source_dir>; cp -r . <dest_dir>/."

Это копирует содержимое source_dir в контейнере с container_name в dest_dir в рамках нового тома new_volume_name.

Чтобы убедиться, что это сработало, вы можете перечислить содержимое dest_dir с:

docker run --rm -i -v <new_colume_name>:/tmp ubuntu find /tmp

На момент написания этой статьи единственным вариантом было скопировать данные. Детали могут варьироваться в зависимости от вашей конкретной настройки. Общий список шагов, которые необходимо выполнить, выглядит следующим образом:

  1. Остановите и удалите исходный контейнер, чтобы создать новый том на шаге 3.

    docker stop NAMEdocker rm NAME# ordocker-compose stop SERVICEdocker-compose rm SERVICE

    В некоторых случаях вы можете отложить удаление исходного контейнера, например, при переключении с docker-compose анонимный том для docker-compose именованный том. В этом случае up создало бы новый том. И вы можете приступить к копированию данных. Но даже в этом случае рекомендуется остановить контейнер, чтобы избежать изменения данных при их копировании. И вы должны удалить исходный контейнер для docker-compose чтобы переключиться на новую громкость (обратите внимание на предупреждения).

    В некоторых случаях это на самом деле не требуется, например, при переключении с автономных контейнеров на docker-compose.

  2. Изменить docker-compose.yml если применимо.

  3. Запустите новый контейнер для создаваемого нового тома.

    Автономные контейнеры:

    docker run ...# ordocker-compose up -d
  4. Остановите новый контейнер, чтобы избежать изменения данных.

    docker stop ...# ordocker-compose stop

    В случае перехода, например, на автономный контейнер с именованным томом, вы можете просто создать том вместо запуска / остановки контейнера.

  5. Скопируйте данные.

    docker run --rm -v "SRC_VOLUME:/from" -v "DST_VOLUME:/to" \    bash -c '        shopt -s dotglob        # rm -r /to/*  # e.g. pg might have populated the new volume        cp -r /from/* /to    '

    Где SRC_VOLUME, DST_VOLUME - имя тома, идентификатор или абсолютный путь к каталогу на хосте.

    Чтобы перечислить тома, прикрепленные к контейнеру, используйте:

    docker inspect CONTAINER --format '{{json .Mounts}}' | jq

    Где CONTAINER - имя или идентификатор контейнера.

  6. Запустите новый контейнер.

    docker run ...# ordocker-compose up -d
  7. Радуйтесь :)

В случае, если вы хотите поэкспериментировать с различными настройками, ознакомьтесь со следующим суть.

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

Сначала экспортируйте файловую систему ваших контейнеров:

docker container export -o filename CONTAINER

И после / при создании нового контейнера импортируйте архив в вашу файловую систему:

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

Если вы укажете архив, Docker разархивирует его в контейнере относительно / (root).

Вы также можете создавать изображения без тегов с помощью этого маленького денди:

docker import filesystem.tar