Pendekatan yang lebih mandiri:
- buat file javascript yang menginisialisasi database Anda
- buat gambar buruh pelabuhan MongoDB turunan yang berisi file-file ini
Ada banyak jawaban yang menggunakan wadah sekali pakai atau membuat volume dan menautkannya, tetapi ini tampaknya terlalu rumit. Jika Anda melihat docker-entrypoint.sh gambar mongo docker, Anda melihat bahwa baris 206 mengeksekusi /docker-entrypoint-initdb.d/*.js
file di inisialisasi menggunakan sintaks:mongo <db> <js-file>
. Jika Anda membuat gambar buruh pelabuhan MongoDB turunan yang berisi data benih Anda, Anda dapat:
- memiliki satu perintah docker run yang menjalankan mongo dengan data seed
- memiliki data yang dipertahankan melalui pemberhentian dan permulaan penampung
- reset data tersebut dengan perintah docker stop, rm, dan run
- sebarkan dengan mudah dengan penjadwal runtime seperti k8s, mesos, swarm, rancher
Pendekatan ini sangat cocok untuk:
- POC yang hanya membutuhkan beberapa data realistis untuk ditampilkan
- Pipa CI/CD yang membutuhkan data yang konsisten untuk pengujian kotak hitam
- contoh penerapan untuk demo produk (insinyur penjualan, pemilik produk)
Cara:
- Buat dan uji skrip inisialisasi Anda (data perawatan yang sesuai)
-
Buat Dockerfile untuk gambar turunan Anda yang menyalin skrip init Anda
FROM mongo:3.4 COPY seed-data.js /docker-entrypoint-initdb.d/
-
Bangun citra buruh pelabuhan Anda
docker build -t mongo-sample-data:3.4 .
-
Secara opsional, dorong gambar Anda ke registri buruh pelabuhan untuk digunakan orang lain
-
Jalankan gambar buruh pelabuhan Anda
docker run \ --name mongo-sample-data \ -p 27017:27017 \ --restart=always \ -e MONGO_INITDB_DATABASE=application \ -d mongo-sample-data:3.4
Secara default, docker-entrypoint.sh akan menerapkan skrip Anda ke test
db; jalankan perintah di atas env var MONGO_INITDB_DATABASE=application
akan menerapkan skrip ini ke application
db sebagai gantinya. Atau, Anda dapat membuat dan beralih ke dbs yang berbeda di file js.
Saya memiliki repo github yang melakukan hal ini - berikut adalah file yang relevan.