EDYTUJ - od 23 lipca 2015
Oficjalny obraz dokera postgres uruchomi .sql
skrypty znalezione w /docker-entrypoint-initdb.d/
teczka.
Wszystko, czego potrzebujesz, to utworzenie następującego skryptu sql:
init.sql
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
i dodaj go w swoim Dockerfile:
Plik Dockera
FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/
Ale od 8 lipca 2015 r. jeśli potrzebujesz tylko utworzyć użytkownika i bazę danych , łatwiej jest po prostu skorzystać z POSTGRES_USER
, POSTGRES_PASSWORD
i POSTGRES_DB
zmienne środowiskowe:
docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres
lub za pomocą pliku Dockerfile:
FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker
dla obrazów starszych niż 23 lipca 2015
Z dokumentacji obrazu postgres Docker wynika, że
[...] będzie źródłem dowolnego skryptu *.sh znalezionego w tym katalogu [/docker-entrypoint-initdb.d
], aby wykonać dalszą inicjalizację przed uruchomieniem usługi
Tutaj ważne jest „przed uruchomieniem usługi” . Oznacza to, że Twój skrypt make_db.sh zostanie wykonany przed uruchomieniem usługi postgres, stąd komunikat o błędzie "nie można połączyć się z bazą danych postgres" .
Potem jest jeszcze jedna przydatna informacja:
Jeśli musisz wykonać polecenia SQL w ramach inicjalizacji, wysoce zalecane jest użycie trybu pojedynczego użytkownika Postgres.
Zgadzam się, może to być nieco tajemnicze na pierwszy rzut oka. Mówi, że twój skrypt inicjujący powinien uruchomić usługę postgres w trybie pojedynczym przed wykonaniem swoich działań. Możesz więc zmienić plik make_db.ksh skrypt w następujący sposób i powinien przybliżyć Cię do tego, czego chcesz:
UWAGA , zmieniło się to ostatnio w następnym 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 użycie --single
tryb był wymagany:
gosu postgres postgres --single <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL