Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

  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 - имя тома, id или абсолютный путь к каталогу на хосте.

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

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

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

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

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

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

Подводя итог обходной путь:

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