Używamy Postgresa i Docker gdzie pracuję i skończyło się w następujący sposób:
- Skopiuj Dockerfile z repo oficjalne Postgres, dzięki czemu można stworzyć swój własny obraz.
- 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:
- Musimy byłaby wyciągnąć rzeczy z Github za pomocą klucza prywatnego zamiast poświadczenia użytkownika.
- 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.
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
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