EDYCJA - od 23 lipca 2015 r
Oficjalny postgres doker obraz będzie działać .sql
skrypty znajdują się w /docker-entrypoint-initdb.d/
katalogu.
Więc wszystko, czego potrzebujesz, to utworzyć następujący skrypt SQL:
init.sql
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
i dodaj go do swojego pliku Docker:
Plik Docker
FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/
Ale od 8 lipca 2015 roku, jeśli wszystko, co potrzebne jest, aby utworzyć użytkownika i bazę danych , to łatwiej jest po prostu wykorzystać do POSTGRES_USER
, POSTGRES_PASSWORD
i POSTGRES_DB
zmiennych środowiskowych:
docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres
lub z plikiem Dockerfile:
FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker
dla zdjęć starszych niż 23 lipca 2015 r
Z dokumentacji obrazu postgres Docker wynika, że tak
[...] pobierze dowolny skrypt * .sh znaleziony w tym katalogu [ /docker-entrypoint-initdb.d
] w celu przeprowadzenia dalszej inicjalizacji przed uruchomieniem usługi
Ważne jest tutaj „przed uruchomieniem usługi” . Oznacza to, że skrypt make_db.sh zostanie wykonany przed uruchomieniem usługi postgres, dlatego komunikat o błędzie „nie można połączyć się z bazą danych postgres” .
Następnie pojawia się kolejna przydatna informacja:
Jeśli musisz wykonać polecenia SQL w ramach inicjalizacji, wysoce zalecane jest użycie trybu pojedynczego użytkownika Postgres.
Zgadzam się, że na pierwszy rzut oka może to być nieco tajemnicze. Mówi, że skrypt inicjujący powinien uruchomić usługę postgres w trybie pojedynczym przed wykonaniem swoich działań. Możesz więc zmienić skrypt make_db.ksh w następujący sposób i powinien on przybliżyć cię do tego, co chcesz:
UWAGA , ostatnio zmieniło się to w następującym zatwierdzeniu . Będzie to działać z najnowszą zmianą:
export PGUSER=postgres
psql <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
Wcześniej --single
wymagane było użycie trybu:
gosu postgres postgres --single <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
gosu postgres postgres --single < /tmp/somefile.sql
psql -U myDb -d myDb -f myDb.sql
docker-entrypoint-initdb.d
, widzę mójinit.sql
z kodem sql w nim. ALE kiedy otwieram mysql (używając dostępu roota) i piszę pokaż bazy danych, widzę tylko domyślne ustawienie zdocker-compose.yml
pliku! Dlaczego mi to nie działa?db.sql
działa nawet po skopiowaniu do `docker-entrypoint-initdb.d`Możesz teraz umieścić pliki .sql w katalogu init:
Z dokumentów
Więc skopiowanie pliku .sql będzie działać.
źródło
Korzystając z
docker-compose
:Zakładając, że masz następujący układ katalogu:
Plik:
docker-compose.yml
Plik:
Docker/init.sql
Plik:
Docker/db.Dockerfile
Komponowanie i uruchamianie usług:
źródło
Dodałem niestandardowe polecenia do środowiska wywołanego w CMD po uruchomieniu usług ... Nie zrobiłem tego z postgres, ale z Oracle:
i zacznij od
.
źródło
Możesz użyć tych poleceń:
źródło
ENCODING 'LATIN1'
jest bardzo dziwne ... Musisz mieć szczególne potrzeby, aby unikać używania utf8Baza danych musi być uruchomiona przed utworzeniem użytkowników. Do tego potrzebujesz wielu procesów. Możesz albo uruchomić postgres w podpowłoce (&) w skrypcie powłoki, albo użyć narzędzia takiego jak nadzór, aby uruchomić postgres, a następnie uruchomić dowolne skrypty inicjujące.
Przewodnik po superwizorze i oknie dokowanym https://docs.docker.com/articles/using_supervisord/
źródło
W przypadku kompilacji dokera istnieje prosta alternatywa (nie trzeba tworzyć pliku Docker). Wystarczy utworzyć init-database.sh:
I odwołaj się do tego w sekcji tomów:
źródło