Saya mencoba membuat wadah dengan database MySQL dan menambahkan skema ke database ini.
Dockerfile saya saat ini adalah:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
COPY files/epcis_schema.sql /data/epcis_schema.sql
# Change the working directory
WORKDIR data
CMD mysql -u $MYSQL_USER -p $MYSQL_PASSWORD $MYSQL_DATABASE < epcis_schema.sql
Untuk membuat wadah, saya mengikuti dokumentasi yang disediakan di Docker dan menjalankan perintah ini:
docker run --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} -e MYSQL_USER=${DB_USER} -e MYSQL_PASSWORD=${DB_USER_PASSWORD} -e MYSQL_DATABASE=${DB_NAME} -d mvpgomes/epcisdb
Tetapi ketika saya menjalankan perintah ini, Container tidak dibuat dan dalam status Container, dimungkinkan untuk melihat bahwa CMD tidak dieksekusi dengan sukses, pada kenyataannya hanya mysql
perintah yang dieksekusi.
Lagi pula, apakah ada cara untuk menginisialisasi database dengan skema atau apakah saya perlu melakukan operasi ini secara manual?
mysql
docker
database-schema
Marcus Gomes
sumber
sumber
Jawaban:
Saya minta maaf atas jawaban super panjang ini, tetapi, Anda memiliki sedikit cara untuk pergi ke tempat yang Anda inginkan. Saya akan mengatakan bahwa biasanya Anda tidak akan menempatkan penyimpanan untuk database dalam wadah yang sama dengan database itu sendiri, Anda akan me-mount volume host sehingga data tetap ada pada host buruh pelabuhan, atau, mungkin sebuah wadah dapat digunakan untuk tahan data (/ var / lib / mysql). Juga, saya baru di mysql, jadi, ini mungkin tidak super efisien. Yang mengatakan ...
Saya pikir mungkin ada beberapa masalah di sini. Dockerfile digunakan untuk membuat gambar. Anda perlu menjalankan langkah pembangunan. Minimal, dari direktori yang berisi Dockerfile Anda akan melakukan sesuatu seperti:
Dockerfile menjelaskan gambar yang akan dibuat. Saya tidak tahu banyak tentang mysql (saya seorang fanboy postgres), tetapi, saya melakukan pencarian di sekitar jalinan untuk 'bagaimana saya menginisialisasi wadah buruh pelabuhan mysql'. Pertama saya membuat direktori baru untuk bekerja, saya menyebutnya mdir, lalu saya membuat direktori file yang saya simpan file epcis_schema.sql yang membuat database dan satu tabel:
Kemudian saya membuat skrip bernama init_db di direktori file:
(sebagian besar skrip ini diangkat dari sini: https://gist.github.com/pda/9697520 )
Berikut ini skrip file / run_db yang saya buat:
Akhirnya, Dockerfile mengikat semuanya:
Jadi, saya pindah ke direktori mdir saya (yang memiliki Dockerfile bersama dengan direktori file). Saya kemudian menjalankan perintah:
Anda akan melihat output seperti ini:
Anda sekarang memiliki gambar '7f6d5215fe8d'. Saya dapat menjalankan gambar ini:
dan gambar dimulai, saya melihat string contoh:
Saya kemudian bisa 'menghentikannya', dan memulai kembali.
Jika Anda melihat log, baris pertama akan berisi:
Kemudian, di akhir log:
Ini adalah pesan-pesan dari skrip / tmp / run_db, yang pertama menunjukkan bahwa basis data dibongkar dari versi yang disimpan (awal), yang kedua menunjukkan bahwa basis data sudah ada di sana, sehingga salinan yang ada digunakan.
Berikut ini adalah ls-lR dari struktur direktori yang saya jelaskan di atas. Perhatikan bahwa init_db dan run_db adalah skrip dengan set bit eksekusi:
sumber
init_db
skrip.RUN
perintah dan masalahnya ternyata terpecahkan. Tetapi kemudian ketika saya mengeksekusidocker run
saya memiliki masalah yang sama denganrun_db
skrip.Saya memiliki masalah yang sama di mana saya ingin menginisialisasi skema instance MySQL Docker saya, tetapi saya mengalami kesulitan mendapatkan ini bekerja setelah melakukan beberapa Googling dan mengikuti contoh orang lain. Inilah cara saya menyelesaikannya.
1) Buang skema MySQL Anda ke file.
2) Gunakan perintah ADD untuk menambahkan file skema Anda ke
/docker-entrypoint-initdb.d
direktori dalam wadah Docker. Thedocker-entrypoint.sh
File akan menjalankan file apapun dalam direktori ini berakhir dengan".sql"
terhadap database MySQL.Dockerfile:
3) Mulai instance Docker MySQL.
Terima kasih untuk Menyiapkan MySQL dan mengimpor dump di dalam Dockerfile karena petunjuk saya tentang di docker-entrypoint.sh dan fakta bahwa ia menjalankan skrip SQL dan shell!
sumber
schema.sql
? Saya ingin db saya diperbarui sesuai. Juga apa yang terjadi ketika saya membangun wadah ini untuk kedua kalinya? Akankah db dihancurkan dan dibuat lagi?Cara lain berdasarkan gabungan respons serveral di sini sebelumnya:
file komposisi buruh pelabuhan:
di mana
/home/user
.. adalah folder bersama di hostDan di
/home/user/db/mysql/init
folder .. cukup letakkan satu file sql, dengan nama apa saja, misalnyainit.sql
berisi:Menurut dokumentasi resmi mysql , Anda dapat menempatkan lebih dari satu file sql di
docker-entrypoint-initdb.d
, mereka dieksekusi dalam urutan abjadsumber
Cara sederhana lainnya, gunakan docker-compose dengan baris berikut:
Masukkan skema basis data Anda ke file ./database/install_db.sql. Setiap kali ketika Anda membangun wadah Anda, install_db.sql akan dieksekusi.
sumber
Saya sudah mencoba jawaban Greg dengan nol keberhasilan, saya pasti telah melakukan sesuatu yang salah karena database saya tidak memiliki data setelah semua langkah: Saya menggunakan gambar terbaru MariaDB, untuk berjaga-jaga.
Kemudian saya memutuskan untuk membaca entri untuk gambar resmi MariaDB , dan menggunakannya untuk menghasilkan file komposisi buruh pelabuhan yang sederhana :
Sekarang saya dapat menyimpan data saya DAN menghasilkan database dengan skema saya sendiri!
sumber
Setelah 4 Agustus 2015, jika Anda menggunakan gambar Docker mysql resmi, Anda bisa menambahkan / menyalin file ke direktori /docker-entrypoint-initdb.d/ dan itu akan berjalan dengan wadah diinisialisasi. Lihat github: https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225 jika Anda ingin menerapkannya pada gambar wadah lain
sumber
Solusi termudah adalah dengan menggunakan tutum / mysql
Langkah 1
Langkah 2
Step3
Dapatkan CONTAINER_ID di atas dan kemudian jalankan perintah
docker logs
untuk melihat informasi kata sandi yang dihasilkan.sumber
tutum/mysql:5.5
dan berhasil.docker run -d -p 3306:3306 -v /tmp:/tmp -e MYSQL_PASS="admin" -e STARTUP_SQL="/tmp/mysqldump.mysql" tutum/mysql:5.5
. Anda selalu dapat menjalankan perintahdocker logs CONTAINER_ID
untuk melihat pesan kesalahan jika Anda menemui masalah./tmp/to_be_imported.mysql
itu berasal. apakah itu jalan pada OS host? di mana aCOPY
atauADD
untuk meletakkan sesuatu ke sistem file wadah?COPY
/ADD
karena direktori host / tmp sudah terpasang ke / tmp dari wadah. Perhatikan baik-baik perintah yang ada di sana-v /tmp:/tmp
. Secara pribadi saya tidak akan memasang volume hanya untuk membuat file tersedia untuk wadah tetapi saya kira itu adalah pilihan pribadi.Bagi yang tidak ingin membuat skrip entrypoint seperti saya, Anda sebenarnya dapat memulai mysqld pada waktu build dan kemudian menjalankan perintah mysql di Dockerfile Anda seperti:
Kuncinya di sini adalah mengirim mysqld_safe ke latar belakang dengan satu
&
tanda.sumber
Di bawah ini adalah Dockerfile yang saya gunakan dengan sukses untuk menginstal xampp, membuat MariaDB dengan skema dan diisi sebelumnya dengan info yang digunakan pada server lokal (usrs, foto pesanan, dll.)
sumber
Setelah berjuang sedikit dengan itu, lihat Dockerfile menggunakan volume bernama (db-data). Sangat penting menyatakan nilai tambah pada bagian akhir, di mana saya menyebutkan volume itu
[external]
Semua bekerja sangat baik dengan cara ini!
sumber