Membuat wadah mysql buruh pelabuhan dengan skema database yang disiapkan

17

Saya ingin membuat gambar buruh pelabuhan 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 (Dockerfile saya):

FROM mysql

ENV MYSQL_ROOT_PASSWORD="bagabu"
ENV MYSQL_DATABASE="imhere"

ADD imhere.sql /tmp/imhere.sql

RUN "mysql -u root --password="bagabu" imhere < /tmp/imhere.sql"

Menurut pemahaman saya, itu tidak berhasil karena gambar buruh pelabuhan mysql tidak mengandung klien mysql (praktik terbaik menyatakan "jangan menambahkan hal-hal hanya karena mereka akan menyenangkan untuk dimiliki") (apakah saya salah tentang ini?)

apa mungkin cara yang baik untuk melakukan ini? Saya sudah memikirkan beberapa hal, tetapi semuanya tampak seperti solusi yang berantakan.

  1. instal klien mysql, lakukan apa yang harus saya lakukan dengannya, kemudian 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 terdengar seperti kumpulan masalah yang terkontaminasi)

Ada saran? Semoga dengan cara yang mudah dipelihara nanti dan mungkin sesuai dengan praktik terbaik juga?

Tom Klino
sumber

Jawaban:

14

Anda harus meletakkan skrip init Anda di direktori yang dipasang sebagai /docker-entrypoint-initdb.d- lihat bagian "Menginisialisasi contoh baru" di dokumen gambar MySQL Docker .

Greg Dubicki
sumber
2
Itu berfungsi untuk memunculkan wadah baru dan memuatnya dengan skema saya. Yang mana cara yang bagus untuk mengatasinya, tetapi bagaimana jika saya mencari cara untuk membuat gambar buruh pelabuhan saya sendiri yang sudah memiliki skema yang sudah diinstal?
Tom Klino
Sebenarnya, nevermind :-) Saya pikir /docker-entrypoint-initdb.dada di host tetapi sebenarnya di dalam wadah. Saya mengubah ADDperintah untuk menyalin ke direktori itu dan menghapus RUNperintah. Docker berhasil membangun gambar dan saya mengujinya dan berfungsi.
Tom Klino
14

Saya harus melakukan ini untuk keperluan tes.

Inilah yang saya lakukan dengan memanfaatkan gambar MySQL / MariaDB aktual di dockerhub dan pembuatan 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 init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root

COPY 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:latest

COPY --from=builder /initialized-db /var/lib/mysql

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

Martin Roy
sumber
2
jawaban terbaik yang saya temukan di seluruh internet, milik saya untuk postgres, jadi itu sedikit lebih sulit, tetapi akhirnya berhasil. Dan itu bekerja dengan sempurna!
snowe2010
Versi mysql yang lebih lama (5.7.9) tidak memiliki /usr/local/bin/docker-entrypoint.sh yang dikaitkan dengan /entrypoint.sh, alih-alih hanya memiliki entrypoint.sh di /. Mengubah /usr/local/bin/docker-entrypoint.sh ke /entrypoint.sh bisa berfungsi dan mungkin juga bisa digunakan untuk rilis "modern".
Marvin
2

Kredit ke @Martin Roy

Membuat perubahan kecil agar berfungsi untuk ...

Content 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 init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root

COPY 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:latest

COPY --from=builder /initialized-db /var/lib/mysql

Setup 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

Venkateswara Rao
sumber
-1

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

Patrick
sumber
Itu menarik - Saya menggunakan Ansible tetapi belum menggunakannya untuk gambar Docker. Bisakah Anda memberikan jawaban dengan beberapa contoh, Patrick?
Greg Dubicki
Ansible memiliki halaman dokumen yang luar biasa, Anda dapat menemukan modul Ansible di url ini: docs.ansible.com/ansible/docker_module.html Pada setiap halaman dalam bab modul, panduan ini adalah beberapa contoh.
Patrick