Bir MySQL veritabanını Docker konteynerinde şema ile nasıl başlatabilirim?
MySQL veritabanı ile bir konteyner oluşturmaya ve bu veritabanına bir şema eklemeye çalışıyorum.
Şu anki Docker dosyam:
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
Konteyneri oluşturmak için Docker'da sağlanan belgeleri takip ediyorum ve bu komutu çalıştırıyorum:
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
Ancak bu komutu çalıştırdığımda Konteyner oluşturulmuyor ve Konteyner durumunda CMD'nin başarılı bir şekilde yürütülmediğini görmek mümkün, aslında sadece mysql
komutu yürütülüyor.
Her neyse, veritabanını şema ile başlatmanın bir yolu var mı yoksa bu işlemleri manuel olarak mı yapmam gerekiyor?
141
3
Bu çok uzun cevap için özür dilerim, ancak istediğiniz yere ulaşmak için biraz yolunuz var. Normalde veritabanı için depolama alanını veritabanının kendisiyle aynı konteynere koymayacağınızı söyleyeceğim, ya bir ana bilgisayar birimi bağlarsınız, böylece veriler docker ana bilgisayarında kalır ya da belki verileri tutmak için bir konteyner kullanılabilir (/var/lib/mysql). Ayrıca, mysql'de yeniyim, bu yüzden bu süper verimli olmayabilir. Bununla birlikte...
Sanırım burada birkaç sorun olabilir. Dockerfile bir imaj oluşturmak için kullanılır. Derleme adımını çalıştırmanız gerekir. En azından, Dockerfile'ı içeren dizinden şöyle bir şey yapmalısınız:
Dockerfile oluşturulacak görüntüyü tanımlıyor. Mysql hakkında çok fazla bilgim yok (ben bir postgres fanboyuyum), ama internette 'bir mysql docker konteynerini nasıl başlatırım' diye bir arama yaptım. Önce çalışmak için yeni bir dizin oluşturdum, buna mdir adını verdim, sonra bir veritabanı ve tek bir tablo oluşturan bir epcis_schema.sql dosyasını bıraktığım bir dosyalar dizini oluşturdum:
Daha sonra dosyalar dizininde init_db adında bir betik oluşturdum:
(bu senaryonun çoğu buradan alınmıştır: https://gist.github.com/pda/9697520)
İşte oluşturduğum files/run_db betiği:
Son olarak, hepsini bağlamak için Docker dosyası:
Bu yüzden, mdir dizinime (dosyalar dizini ile birlikte Docker dosyasını içeren) cd'ledim. Daha sonra şu komutu çalıştırdım:
Bunun gibi bir çıktı görmelisiniz:
Artık bir görüntünüz var '7f6d5215fe8d'. Bu görüntüyü çalıştırabilirim:
ve görüntü başladığında bir örnek dizesi görüyorum:
Daha sonra 'durdurabilir' ve yeniden başlatabilirim.
Günlüklere bakarsanız, ilk satır şunları içerecektir:
Sonra, kayıtların sonunda:
Bunlar /tmp/run_db betiğinden gelen mesajlardır, ilki veritabanının kaydedilmiş (ilk) sürümden açıldığını gösterir, ikincisi ise veritabanının zaten orada olduğunu, bu nedenle mevcut kopyanın kullanıldığını gösterir.
İşte yukarıda tanımladığım dizin yapısının ls -lR'si. init_db ve run_db'nin execute biti ayarlanmış betikler olduğuna dikkat edin:
Greg'in cevabını sıfır başarı ile denedim, tüm adımlardan sonra veritabanımda veri olmadığına göre bir şeyleri yanlış yapmış olmalıyım: Her ihtimale karşı MariaDB'nin en son sürümünü kullanıyordum.
Daha sonra resmi MariaDB imajı giriş noktasını okumaya karar verdim ve bunu basit bir docker-compose dosyası oluşturmak için kullandım:
Artık verilerimi kalıcı hale getirebiliyorum VE kendi şemamla bir veritabanı oluşturabiliyorum!
En kolay çözüm tutum/mysql kullanmaktır.
Adım1
Adım2
Adım3
Yukarıdaki CONTAINER_ID'yi alın ve ardından oluşturulan parola bilgilerini görmek için
docker logs
komutunu çalıştırın.