Membuat wadah mysql docker dengan skema database yang disiapkan

Saya ingin membuat gambar docker di atas mysql yang sudah berisi skema yang diperlukan untuk aplikasi saya.

Saya mencoba menambahkan baris ke Dockerfile yang akan mengimpor skema saya sebagai file sql. Saya melakukannya seperti itu (Dockerfile saya):

FROM mysqlENV MYSQL_ROOT_PASSWORD="bagabu"ENV MYSQL_DATABASE="imhere"ADD imhere.sql /tmp/imhere.sqlRUN "mysql -u root --password="bagabu" imhere < /tmp/imhere.sql"

Menurut pemahaman saya, itu tidak berhasil karena gambar docker mysql tidak berisi klien mysql (praktik terbaik menyatakan "Jangan menambahkan sesuatu hanya karena mereka akan menyenangkan untuk dimiliki") (apakah saya salah tentang ini?)

apa yang mungkin menjadi cara yang baik untuk melakukan hal ini? Saya memiliki beberapa hal dalam pikiran, tetapi semuanya tampak seperti solusi yang berantakan.

  1. instal klien mysql, lakukan apa yang harus saya lakukan dengannya, lalu hapus/bersihkan.
  2. salin biner klien mysql ke gambar, lakukan apa yang harus saya lakukan, lalu hapus.
  3. Buat skema di server sql lain dan Salin file db sendiri secara langsung (ini tampak sangat berantakan dan bagi saya terdengar seperti kumpulan masalah yang terkontaminasi)

Ada saran? Mudah-mudahan dengan cara yang akan mudah untuk mempertahankan kemudian dan mungkin sesuai dengan praktik terbaik juga?

Saya harus melakukan ini untuk tujuan tes.

Inilah cara saya melakukannya dengan memanfaatkan gambar MySQL / MariaDB yang sebenarnya di dockerhub dan build multi-tahap:

FROM mariadb:latest as builder# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only initRUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]# needed for intializationENV MYSQL_ROOT_PASSWORD=rootCOPY setup.sql /docker-entrypoint-initdb.d/# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.# https://docs.docker.com/engine/reference/builder/#volume :#       Changing the volume from within the Dockerfile: If any build steps change the data within the volume after#       it has been declared, those changes will be discarded.RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db", "--aria-log-dir-path", "/initialized-db"]FROM mariadb:latestCOPY --from=builder /initialized-db /var/lib/mysql

Contoh kerja lengkap di sini : https://github.com/lindycoder/prepopulated-mysql-container-example

Anda harus meletakkan skrip init Anda di direktori yang dipasang sebagai /docker-entrypoint-initdb.d - lihat" menginisialisasi contoh segar " bagian dalam MySQL Docker image docs.

Kredit untuk @ Martin Roy

Membuat perubahan kecil untuk bekerja untuk mysql...

Konten Dockerfile

FROM mysql:latest as builder# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only initRUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]# needed for intializationENV MYSQL_ROOT_PASSWORD=rootCOPY setup.sql /docker-entrypoint-initdb.d/# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.# https://docs.docker.com/engine/reference/builder/#volume :#       Changing the volume from within the Dockerfile: If any build steps change the data within the volume after#       it has been declared, those changes will be discarded.RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]FROM mysql:latestCOPY --from=builder /initialized-db /var/lib/mysql

Pengaturan konten.sql

CREATE DATABASE myexample;USE myexample;CREATE TABLE mytable (myfield VARCHAR(20));INSERT INTO mytable VALUES ('Hello'), ('Dolly');

Contoh kerja lengkap di sini : https://github.com/iamdvr/prepopulated-mysql-container-example

Ini berfungsi dan mengikuti antarmuka dengan skrip titik masuk mariadb. File dengan pengaturan, tabel, data, dan pengguna disalin ke folder. Ketika wadah dimulai script entry point menemukan file dan menciptakan database baru.

FROM mariadb:10.5.5ENV MYSQL_ROOT_PASSWORD=blablablablablablaCOPY settings/my.cnf /etc/mysql/conf.d# comment out !includedir /etc/mysql/conf.d/ to stop recursionRUN sed -i 's/!includedir \/etc\/mysql\/conf\.d\//#!includedir \/etc\/mysql\/conf\.d\//' /etc/mysql/conf.d/my.cnfCOPY db_scripts/db_setup.sql /docker-entrypoint-initdb.d/COPY db_scripts/db_data.sql.template /docker-entrypoint-initdb.d/db_template.sqlCOPY db_scripts/db_users.sql /docker-entrypoint-initdb.d/# Note the port 3306 can be exposed

Jawaban @ Venkateswara Rao dan @ Martin Roy berfungsi dengan baik jika Anda tidak peduli jika perubahan pada DOCKERIZED DB masih dimasukkan ke dalam Volume. Dalam kasus saya, saya menginginkan gambar buruh pelabuhan yang sudah diisi sebelumnya dengan data, tetapi dalam proyek di mana kami sering melakukan migrasi basis data. Jadi, saya ingin sesekali membuat wadah DB, menjalankan migrasi, lalu entah bagaimana mendorong perubahan itu kembali sehingga pengguna berikutnya yang menggunakan gambar DB Sudah menerapkan migrasi. Karena file DB hidup dalam Volume, mereka tidak bisa digulung menjadi gambar dengan docker commmit my-migrated-db-container my-new-db-image.

Solusi saya adalah menggunakan pejabat MySQL (5.6 di saya. kasus) Dockerfile (dan entrypoint berkas) untuk menciptakan kembali pekerjaan mereka setelah menghapus VOLUME /var/lib/mysql line. Dari gambar yang dihasilkan, saya kemudian menggunakan file Venkateswara untuk membuat gambar DB yang dimuat sebelumnya di mana bahkan semua data DB masa depan disimpan dalam wadah itu sendiri (bukan pada Volume).

Catatan: file Dockerfile yang ditautkan sudah lama mengacu pada server kunci GPG yang sudah usang (mis keys.openpgp.org). Anda dapat mengganti nama server ini dengan, katakanlah, keyserver.ubuntu.com.

Ini file docker saya yang berfungsi dengan baik./ sql-scripts / akan berisi file sql kustom Anda (berisi db yang anda siapkan) yang dijalankan setelah wadah berjalan. Anda mungkin ingin melihat pemasangan volume.

FROM mysql:5.6COPY ./sql-scripts/ /docker-entrypoint-initdb.d/

Perangkat lunak manajemen seperti Ansible dapat membantu Anda mengotomatiskan impor mysql dengan mudah tanpa perlu menginstal dan menginstal ulang Klien.Ansible memiliki fitur built-in yang hebat untuk mengelola gambar dan kontainer docker dan database mysql.

Lihat juga: [Bagaimana Saya bisa menginisialisasi Database MySQL dengan skema dalam wadah Docker?] (How can I initialize a MySQL database with schema in a Docker container? - Stack Overflow)