Hazırlanan bir veritabanı şemasına sahip bir liman işçisi mysql konteyneri oluşturma


17

Uygulamam için gerekli şemayı içeren mysql'in üstünde bir docker görüntüsü oluşturmak istiyorum.

Düzenimi sql dosyası olarak içe aktaracak Dockerfile satırları eklemeyi denedim. Ben böyle yaptım (Dockerfile):

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"

Anladığım kadarıyla, mysql docker görüntüsü bir mysql istemcisi içermediğinden işe yaramadı (en iyi uygulamalar "sadece sahip olacakları için bir şeyler eklemeyin") (bu konuda yanlış mıyım?)

bunu yapmanın iyi bir yolu ne olabilir? Aklımda birkaç şey vardı, ama hepsi dağınık geçici çözümler gibi görünüyor.

  1. mysql istemcisini kurun, onunla ne yapmam gerektiğini yapın, ardından kaldırın / temizleyin.
  2. mysql istemci ikili görüntüyü kopyalayın, ne yapmam gerektiğini yapın, sonra kaldırın.
  3. Şemayı başka bir sql sunucusunda oluşturun ve db dosyasını doğrudan kopyalayın (bu çok dağınık görünüyor ve bana kirli bir havuz havuzu gibi geliyor)

Herhangi bir öneri? Umarım daha sonra bakımı kolay olacak ve belki de en iyi uygulamalara uygun olacak?


Yanıtlar:


14

İnit betiğinizi aşağıdaki gibi bir dizine koymalısınız /docker-entrypoint-initdb.d- MySQL Docker görüntü belgelerindeki "Yeni bir örneği başlatma" bölümüne bakın .


2
Bu, yeni bir kap getirmek ve şemamla yüklemek için işe yarar. Hangi güzel bir yol, ama önceden şema önceden yüklenmiş kendi docker görüntü oluşturmak için bir yol arıyorsanız ?
Tom Klino

Aslında, nevermind :-) Ben /docker-entrypoint-initdb.dev sahibi olduğunu düşündüm ama aslında konteyner. ADDBu dizine kopyalama komutunu değiştirdim ve komutu kaldırdım RUN. Docker görüntüyü başarıyla oluşturdu ve test ettim ve işe yarıyor.
Tom Klino

14

Bunu test amacıyla yapmak zorunda kaldım.

Dockerhub ve çok aşamalı yapıdaki gerçek MySQL / MariaDB görüntülerinden yararlanarak şöyle yaptım:

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

Tam çalışma örneği: https://github.com/lindycoder/prepopulated-mysql-container-example


2
tüm internette bulduğum en iyi cevap, benim postgres içindi, bu yüzden biraz daha zordu, ama sonunda işe yaradı. Ve mükemmel çalışıyor!
snowe2010

Eski mysql (5.7.9) sürümlerinde /usr/local/bin/docker-entrypoint.sh /ententpoint.sh dosyasına bağlanmıştır, bunun yerine / inputpoint.sh dosyasına sahip olmanız yeterlidir. /Usr/local/bin/docker-entrypoint.sh dosyasının /entrypoint.sh olarak değiştirilmesi ve muhtemelen "modern" sürümler için de çalışması gerekir.
Marvin

2

@Martin Roy'a Kredi

MySQL için çalışmak için küçük değişiklikler yaptı ...

İçerik 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

İçerik kurulumu.sql

CREATE DATABASE myexample;

USE myexample;

CREATE TABLE mytable (myfield VARCHAR(20));

INSERT INTO mytable VALUES ('Hello'), ('Dolly');

Tam çalışma örneği: https://github.com/iamdvr/prepopulated-mysql-container-example


-1

Ansible gibi yönetim yazılımları, bir istemci kurmanıza ve yeniden kurmanıza gerek kalmadan kolay bir mysql içe aktarma işlemini otomatikleştirmenize yardımcı olabilir. Ansible, liman işçilerinin görüntülerini ve kapsayıcılarını ve MySQL veritabanlarını yönetmek için mükemmel yerleşik özelliklere sahiptir.


Bu ilginç - Ansible'ı kullandım ama Docker görüntüleri için kullanmadım. Cevabınızı bazı örneklerle uzatabilir misiniz Patrick?
Greg Dubicki

Ansible'ın harika bir dokümanlar sayfası var, bu url'de Ansible modülünü bulabilirsiniz: docs.ansible.com/ansible/docker_module.html Bu kılavuzun modül bölümündeki her sayfada bazı örnekler bulunmaktadır.
Patrick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.