2016-06-15 24 views
7

Mam pytanie dotyczące docker i postgres. Ustanawiam nową bazę danych PostgreS za każdym razem, gdy uruchamiany jest docker i chcę zaimportować dany zrzut.Docker-Compose Postgresql import dump

mój problem jest podobny, ale odpowiedzi nie są wystarczające dla mnie: Docker postgres does not run init file in docker-entrypoint-initdb.d

Docker-Compose:

postgres: 
    environment: 
    - POSTGRES_USER=**** 
    - POSTGRES_PASSWORD=**** 
    - POSTGRES_DB=**** 
build: 
    context: . 
    dockerfile: dockerfile-postgres 

My Dockerfile: (próbowałem go już ze skryptu z SH kończąc)

FROM postgres 
ADD dump.sql /docker-entrypoint-initdb.d/ 

Zgodnie z https://hub.docker.com/_/postgres/ do zaimportowania bazy danych należy użyć dump.sql.

Uruchamianie aplikacji z docker daje tylko:

postgres_1  | LOG: invalid record length at 0/1708600 
postgres_1  | LOG: redo is not required 
postgres_1  | LOG: MultiXact member wraparound protections are now enabled 
postgres_1  | LOG: database system is ready to accept connections 
postgres_1  | LOG: autovacuum launcher started 

Poza Testowałem jeśli baza danych została importowana, nie ma tabeli w mojej bazy danych. Co robię źle (pliki są odczytywane i wykonywalne w systemie docelowym)? Importowanie go za pomocą psql nie stanowi problemu, więc mój zrzut jest poprawny.

Mam nadzieję, że możesz mi pomóc i chcę z góry podziękować za to.

+0

Mam nadzieję, że dobrze to zapamiętam, ale "ADD" działa tylko magicznie, gdy jest adresem URL jak w [Docker COPY vs ADD] (http://stackoverflow.com/questions/24958140/docker-copy-vs-add) omówione. Czy nie chcesz uruchomić 'pr_restore' i podać ścieżkę do swojej kopii' dump.sql'? ... ale może 'pg_restore' nie działa z wariantem kontenerowym (ponieważ komentarz - 18 dni - na stronie centrum dokowania postgres sugeruje) – Dilettant

+0

Tak, myślałem o kopiowaniu i wypróbowaniu go, ten sam wynik. Plik jest poprawnie trafiony. Próbowałem już z pqdump i skryptem sh w tym folderze. Skrypt powinien mieć tylko nazwę: pg_restore -d nazwa_bazy_danych /tmp/dump.backup. Sam pg_restore pracował na maszynie docelowej, ale skrypt nie jest wykonywany – Simon

+0

To jest pg_restore, co chcesz - nie zrzucaj tego, co jest w DB, ale wypełnij, prawda? – Dilettant

Odpowiedz

9

OK Znalazłem lewę, muszę wykonać "docker-compose rm", aby wykonać skrypty i pliki sql w tym folderze. Po zbudowaniu, a nie usunięciu, folder init jest ignorowany.

AKTUALIZACJA Wpadłem ponownie na ten problem, tym razem usunięcie utworzonego okna dokowanego z obrazami rozwiązało problem.

+0

Po prostu zwróć uwagę, że możesz również potrzebować opcji 'docker-compose build' po uruchomieniu' docker-compose rm', jeśli zmienisz skrypty 'ADD'ed. – user101289

+0

ratowanie życia ... nawet czyszczenie wszystkich obrazów i warstw w docku nie działa, ale tak się stało. – drewboswell

-1

To się dzieje, ponieważ najprawdopodobniej

W InitDB skrypty docker-entryfile.sh który następnie jest odpowiedzialny za prowadzenie /docker-entrypoint-initdb.d/* pliki w kolejności alfabetycznej biegnie po raz pierwszy dopiero gdy woluminy są tworzone.

Możesz zobaczyć niektóre szczegóły here.

Solution (współpracuje ze mną) Jest to urywek z mojego Döcker-komponować pliku

postgres_service: 
    build: 
     context : docker-postgres 
     dockerfile: Dockerfile-base 
    image: 'datahub/postgres:development' 
    user: postgres 
    ports: 
     - "5432:5432" 
    env_file: 
     - credentials/postgres/development.env 
    volumes: 
     - /Users/yogesh.yadav/DockerData/datahub/postgresql/data:/var/lib/postgresql/data 
    restart: unless-stopped 
    networks: 
     - datahubnetwork 

kroki -

1) docker-compose -f docker-compose-filename.yml down

lub

docker-compose -f docker-compose-filename.yml stop postgres_service

2 Usuń wolumin/woluminy (/Users/yogesh.yadav/DockerData/datahub/postgresql/data) dołączone do usługi dokowania postgres_service. Możesz to zrobić ręcznie lub przez docker-compose rm lub docker volume rm. Proszę zidentyfikować swój wolumin dołączony do tej usługi postgres przed jej usunięciem. More info here

3) Docker używa bardzo dobrego zarządzania pamięcią podręczną poprzez budowanie obrazów i ich uruchamianie. Jeśli nie zmodyfikowałeś swojego Dockerfile, docker uruchomi obraz już kompilowany z pamięci podręcznej i uruchom go.Tak więc radziłbym usunąć również obrazy dla usługi postgres_service.

Do listy zdjęć

docker images -a 

Wyjście -

REPOSITORY    TAG     IMAGE ID   CREATED    SIZE 
datahub/postgres   development   e7707e670ad4  35 minutes ago  265 MB 

Usuń ten obraz (Użyj -f jeśli wymagane)

docker rmi IMAGE_ID_HERE 

4) Uruchom ponownie usługę ponownie

docker-compose -f docker-compose-filename.yml up --build postgres_service 

Tym razem możesz zobaczyć, że twoje docker-entrypoint.sh i dump.sql zostaną wykonane.