Я опробовал образ докера с помощью командной строки докера без указания имен томов. Теперь я обнаружил, что хочу продолжить использование этого контейнера / образа, но путем определения контейнера в docker compose.
Что лучшая практика для хранения данных из анонимных / безымянных томов и использования их в новом контейнере, созданном docker compose?
В настоящее время вы не можете переименовать существующие тома. (Это верно независимо от того, были ли они названы ранее или были безымянными, и их имена были автоматически сгенерированы.)
Ты можешь видеть Эта проблема для получения дополнительной информации о реализации этой функции, а также добавьте свои «+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
.
+ Изменить docker-compose.yml
если это применимо.
Запустите новый контейнер для нового тома, который будет создан.
Автономные контейнеры:
docker run ...
# or
docker-compose up -d
Остановите новый контейнер, чтобы избежать изменения данных.
docker stop ...
# or
docker-compose stop
В случае перехода, например, на автономный контейнер с именованным томом, вы можете просто создать том вместо запуска / остановки контейнера.
Скопируйте данные.
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
Где КОНТЕЙНЕР - название или идентификатор контейнера.
Запустите новый контейнер.
docker run ...
# or
docker-compose up -d
Радуйтесь :)
Если вы хотите поэкспериментировать с различными настройками, ознакомьтесь со следующими суть.
Подводя итог обходной путь:
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>