Beberapa hal terjadi di sini:
Pertama, docker commit
adalah bau kode. Ini cenderung digunakan oleh mereka yang membuat gambar dengan proses manual, daripada mengotomatiskan build mereka dengan Dockerfile yang memungkinkan rekreasi yang mudah. Jika memungkinkan, saya sarankan Anda beralih ke Dockerfile untuk pembuatan gambar Anda.
Selanjutnya, sebuah docker commit
tidak akan merekam perubahan yang dibuat pada volume. Dan masalah yang sama ini terjadi jika Anda mencoba memperbarui volume dengan RUN
langkah dalam file Docker. Keduanya menangkap perubahan pada sistem file kontainer dan menyimpan perubahan tersebut sebagai lapisan dalam gambar buruh pelabuhan, dan volumenya bukan bagian dari sistem file kontainer. Ini juga terlihat jika Anda menjalankan docker diff
terhadap sebuah wadah. Dalam hal ini, gambar upstream telah menentukan volume di Dockerfile mereka:
VOLUME /var/lib/mysql
Dan buruh pelabuhan tidak memiliki perintah untuk membatalkan volume yang dibuat dari Dockerfile. Anda perlu memodifikasi definisi gambar secara langsung dari luar buruh pelabuhan (tidak disarankan) atau membuat gambar upstream Anda sendiri dengan menghapus langkah tersebut (disarankan).
Apa yang disediakan oleh gambar mysql adalah kemampuan untuk menyuntikkan skrip pembuatan basis data Anda sendiri di /docker-entrypoint-initdb.d
, yang dapat Anda tambahkan dengan gambar Anda sendiri yang memperluas mysql, atau mount sebagai volume. Di sinilah Anda akan memasukkan skema Anda, atau menginisialisasi dari cadangan yang diketahui untuk pengembangan.
Terakhir, jika tujuannya adalah untuk memiliki kegigihan, Anda harus menyimpan data Anda dalam volume, bukan dengan melakukan container:
docker run -v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
Volume memungkinkan Anda untuk membuat ulang wadah, memutakhirkan ke versi mysql yang lebih baru ketika tambalan dirilis (misalnya perbaikan keamanan) tanpa kehilangan data Anda.
Untuk mencadangkan volume, ini akan diekspor ke tgz:
docker run --rm -v mysql-data:/source busybox tar -cC /source . >backup.tgz
Dan untuk memulihkan volume, ini membuatnya dari tgz:
docker run --rm -i -v mysql-data:/target busybox tar -xC /target <backup.tgz