2015-02-24 12 views
6

Zajmuję się tworzeniem aplikacji open source składającej się z aplikacji WWW Java i bazy danych PostgreSQL. Idealnie byłoby rozmieszczenia podobny do procesu wyszczególnionych w shipyard quickstart:"Poprawny" sposób zarządzania schematami bazy danych w dockerze

  1. prowadzony kontener danych tylko
  2. prowadzony pojemnik DB
  3. prowadzony kontener aplikacji

Czy istnieje zalecany czas na skonfigurowanie schematu bazy danych? Myślałem o zrobieniu Dockerfile dla obrazu bazy danych, aby utworzyć schemat, gdy jest on zbudowany, ale Postgres nie działa w tym czasie oczywiście.

Odpowiedz

3

Używamy Postgresa i Docker gdzie pracuję i skończyło się w następujący sposób:

  1. Skopiuj Dockerfile z repo oficjalne Postgres, dzięki czemu można stworzyć swój własny obraz.
  2. Modyfikuj docker-entrypoint.sh (https://github.com/docker-library/postgres/blob/8f80834e934b7deaccabb7bf81876190d72800f8/9.4/docker-entrypoint.sh), który jest wywoływany podczas uruchamiania kontenera.

Na szczycie docker-entrypoint.sh, kładę się, co następuje:

# Get the schema 
url=$(curl -s -u ${GIT_USER}:${GIT_PASSWORD} "${SQL_SCRIPT_URL}" | python -c 'import sys, json; print json.load(sys.stdin)["download_url"]') 
curl ${url} > db.sh 
chmod +x db.sh 
cp db.sh ./docker-entrypoint-initdb.d 

Zasadniczo pobiera skrypt z Github który inicjuje schematu bazy danych. Robimy to, aby zarządzać wersjami schematu, więc po uruchomieniu kontenera możesz określić, którego schematu użyć przez zmienną ENV.

Kilka uwag o kodzie:

  1. Musimy byłaby wyciągnąć rzeczy z Github za pomocą klucza prywatnego zamiast poświadczenia użytkownika.
  2. Katalog ./docker-entrypoint-initdb.d to miejsce, w którym docker -entrypoint.sh będzie wyglądać tak, aby uruchamiać skrypty init dla bazy danych. Możesz przenosić pliki do tej lokalizacji, jak chcesz. Zrób to, jeśli pobieranie z Github nie ma zastosowania.
+0

Dzięki. Rozumiem, że skrypt jest napisany w taki sposób, że nie ma znaczenia, czy uruchamia się, gdy baza danych jest już utworzona? Zastanawiam się, czy kontener DB miał zostać zrestartowany. – stewartml

+0

Tak, jeśli utrzymujesz bazę danych na hoście z udostępnionymi woluminami, to po ponownym uruchomieniu możesz otrzymać skargę, że baza danych już istnieje. Ale w przypadku takich rzeczy jak tabele, możesz użyć JEŚLI NIE ISTNIEJSZY, aby nie narzekał tak bardzo. =) Przypuszczam, że możesz nawet dokonać lepszego sprawdzenia, aby zapytać bazę danych, czy obiekty istnieją, a jeśli tak, to przestań. – ryan1234

Powiązane problemy