Docker mengubah volume anonim menjadi volume bernama

Saya telah mencoba gambar docker menggunakan baris perintah docker tanpa menentukan nama untuk volume. Sekarang saya menemukan bahwa saya ingin terus menggunakan wadah/gambar ini tetapi dengan mendefinisikan wadah di Docker compose.

Apa itu praktik terbaik untuk menyimpan data dari volume anonim / tidak disebutkan namanya dan menggunakannya dalam wadah baru yang dibuat oleh docker compose?

  • Dapatkah Saya mengubah volume yang tidak disebutkan namanya menjadi volume bernama?
  • atau haruskah saya membuat wadah baru dengan docker compose dengan volume bernama dan menyalin data?
  • atau pilihan lain?

Untuk meringkas solusi:

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>

Metode ini memiliki manfaat menggunakan docker API. Ini menggunakan gambar Linux ringan yang disebut alpine dan shell defaultnya, ash untuk menjalankan salinan berkas, cp -av dari volume lama ke volume yang baru bernama.

Saat ini Anda tidak dapat mengganti nama volume yang ada. (Ini benar apakah mereka sebelumnya bernama atau tidak disebutkan namanya dan nama mereka dibuat secara otomatis.)

Anda dapat melihat masalah ini untuk informasi lebih lanjut tentang pelaksanaan fitur ini, serta menambahkan Anda "+1"/"Thumbs up" untuk membiarkan pengembang tahu bahwa anda menginginkannya.

Tanpa itu, sejauh yang saya tahu, satu-satunya cara yang baik untuk melakukannya adalah dengan membuat volume bernama baru dan menyalin data.

Jawaban CivFan tidak bekerja untuk saya apa adanya, jadi saya memposting solusi saya di sini:

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

Ini menyalin isi dari source_dir dalam wadah dengan container_name into dest_dir dalam volume baru new_volume_name.

Untuk memverifikasi bahwa itu berhasil, Anda dapat membuat daftar konten dest_dir dengan:

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

Pada saat penulisan ini, satu-satunya pilihan adalah menyalin data. Rincian dapat bervariasi tergantung pada setup tertentu. Daftar Umum Langkah-langkah yang harus dilakukan adalah sebagai berikut:

  1. Berhenti dan menghapus wadah sumber untuk membiarkan volume baru dibuat pada Langkah 3.

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

    Dalam beberapa kasus, Anda mungkin dapat menunda penghapusan wadah sumber, misalnya saat beralih dari docker-compose volume anonim untuk docker-compose bernama volume. Dalam hal ini up akan membuat volume baru. Dan Anda dapat melanjutkan dengan menyalin data. Tetapi bahkan dalam kasus ini menghentikan wadah disarankan untuk menghindari data diubah saat Anda menyalinnya. Dan Anda harus menghapus wadah sumber untuk docker-compose untuk beralih ke volume baru (memperhatikan peringatan).

    Dalam beberapa kasus itu tidak benar-benar diperlukan, misalnya saat beralih dari wadah mandiri ke docker-compose.

  2. Perubahan docker-compose.yml jika berlaku.

  3. Mulai wadah baru untuk volume baru yang akan dibuat.

    Wadah mandiri:

    docker run ...# ordocker-compose up -d
  4. Hentikan penampung baru untuk menghindari perubahan data.

    docker stop ...# ordocker-compose stop

    Dalam hal bermigrasi ke misalnya wadah mandiri dengan volume bernama, anda cukup membuat volume sebagai pengganti memulai/menghentikan wadah.

  5. Salin datanya.

    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    '

    Di mana SRC_VOLUME, DST_VOLUME-nama volume, id, atau path absolut ke direktori pada host.

    Untuk daftar volume yang melekat pada penggunaan kontainer:

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

    Dimana kontainer - nama kontainer atau id.

  6. Mulai wadah baru.

    docker run ...# ordocker-compose up -d
  7. Bersukacitalah :)

Jika Anda ingin bereksperimen dengan pengaturan yang berbeda, lihat yang berikut ini gist.