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

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

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

  • Могу ли я как-то преобразовать безымянные в именованные тома?
  • или мне следует создать новый контейнер с docker compose с именованными томами и скопировать данные?
  • или любой другой вариант?
6
задан 7 March 2019 в 17:44
5 ответов

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

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

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

3
ответ дан 3 December 2019 в 00:37

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

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

    docker stop NAME
    docker rm NAME
    # or
    docker-compose stop SERVICE
    docker-compose rm SERVICE
    

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

    В некоторых случаях это не действительно необходимо, например, при переключении от автономных контейнеров до [1 110].

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

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

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

    docker run ...
    # or
    docker-compose up -d
    
  4. Остановка новый контейнер для предотвращения изменяемых данных.

    docker stop ...
    # or
    docker-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
    

    , Где КОНТЕЙНЕР - контейнерное имя или идентификатор.

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

    docker run ...
    # or
    docker-compose up -d
    
  7. Радуются :)

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

0
ответ дан 3 December 2019 в 00:37

Обобщая обходной путь:

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 со старого тома на том с новым именем. .

10
ответ дан 24 June 2020 в 04:08

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

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

docker container export -o filename CONTAINER

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

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

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

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

docker import filesystem.tar
0
ответ дан 16 December 2020 в 07:34

Ответ 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 в контейнер с имя_контейнера в dest_dir в новом томе имя_нового_тома.

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

docker run --rm -i -v <new_colume_name>:/tmp ubuntu find /tmp
3
ответ дан 9 February 2021 в 09:01

Теги

Похожие вопросы