Я опробовал образ докера с помощью командной строки докера без указания имен томов. Теперь я обнаружил, что хочу продолжить использование этого контейнера / образа, но путем определения контейнера в 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
для переключения на новый объем (обратите внимание на предупреждения).
В некоторых случаях это не действительно необходимо, например, при переключении от автономных контейнеров до [1 110].
Изменение 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 - имя тома, идентификатор или полный путь к каталогу на хосте.
Для списка объемов, присоединенных к контейнерному использованию:
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: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
со старого тома на том с новым именем. .
Я нашел это в поисках информации об именованных томах. Я понимаю, что это старый пост, но после его прочтения я провел небольшое исследование и обнаружил, что, по крайней мере, в настоящее время возможно экспортировать файловую систему в виде tar-архива и импортировать tar-архив в изображение или как изображение.
Сначала экспортируйте файловую систему ваших контейнеров:
docker container export -o filename CONTAINER
И после / при создании нового контейнера импортируйте архив в вашу файловую систему:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
Если вы укажете архив, Docker распаковывает его в контейнере относительно / (корневого ).
Вы также можете создавать образы без тегов с помощью этого маленького денди:
docker import filesystem.tar
Ответ 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