2016-06-15 2 views
7

docker 및 postgres에 대한 질문이 있습니다. 도커가 시작될 때마다 새 postgres 데이터베이스를 설정하고 주어진 덤프를 가져 오려고합니다.Docker-Compose Postgresql 가져 오기 덤프

내 문제처럼,하지만 대답은 나를 위해 충분하지 않습니다 : Docker postgres does not run init file in docker-entrypoint-initdb.d

도커 - 작성 :

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

내 Dockerfile : (나는 보통 .sh가 끝나는 스크립트로 이미 그것을 시도)

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

https://hub.docker.com/_/postgres/에 따라 데이터베이스를 가져 오기 위해서는 dump.sql을 사용해야합니다. 고정 표시기를 사용하여 응용 프로그램을 시작

만을 제공합니다

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 

내 데이터베이스 반입 된 경우, 내 데이터베이스에는 테이블이없는 시험 외에. 내가 뭘 잘못하고 있는거야 (파일을 대상 시스템에서 읽고 실행할 수 있습니까?) psql로 가져 오기는 아무런 문제가 없으므로 덤프가 정확합니다.

내가 도와 주시면 감사하겠습니다.

+0

[ADD]는 [Docker COPY vs ADD] (http://stackoverflow.com/questions/24958140/docker-copy-vs-add)와 같이 URL 일 때만 마술을 실행합니다. 논의했다. 'pr_restore'를 실행하고'dump.sql' 복사본의 경로를 지정 하시겠습니까? ...하지만 어쩌면'pg_restore'는 postgres docker 허브 페이지에서 18 일 전의 주석으로 컨테이너 형식으로 작동하지 않습니다. – Dilettant

+0

예를 들어 Copy to에 대해 생각하고 같은 결과를 시도했습니다. 파일이 올바르게 대상입니다. 나는 이미이 폴더에 pqdump와 sh 스크립트를 시도했다. 스크립트는 다음을 호출해야합니다. pg_restore -d databasename /tmp/dump.backup. pg_restore 자체가 대상 컴퓨터에서 작동했지만 스크립트가 실행되고 있지 않습니다. – Simon

+0

pg_restore는 내가 원하는 것입니다. DB에있는 내용을 덤프하지는 않지만 다시 채우십시오. – Dilettant

답변

9

나는이 트릭을 발견했다.이 폴더 내에서 스크립트와 SQL 파일을 실행하기 위해서는 "docker-compose rm"을 실행해야한다. 일단 빌드되고 제거되지 않으면 init 폴더는 무시됩니다.

업데이트 이 문제가 다시 발생했습니다. 이번에는 문제를 해결하기 위해 만든 이미지 고정자를 제거했습니다.

+0

'ADD' 스크립트를 변경했다면'docker-compose rm'을 실행 한 후에'docker-compose build'를해야 할 수도 있습니다. – user101289

+0

생명의 은인 ... 모든 도커 이미지와 레이어를 깨끗하게 처리해도 효과가 없었지만 이렇게했습니다. – drewboswell

-1

이 때문에 대부분의 아마

다음 알파벳 순서로 /docker-entrypoint-initdb.d/* 파일을 실행하기위한 담당하는 initdb에 스크립트 docker-entryfile.sh가 볼륨이 생성되는 경우에만 처음 실행 일어나고있다.

일부 세부 사항은 here입니다.

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

또는

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

-

솔루션이 내 고정 표시기-파일 작성

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 

단계에서 니펫 (나와 함께 작동) 2) postgres_service docker 서비스에 첨부 된 볼륨/볼륨 (/Users/yogesh.yadav/DockerData/datahub/postgresql/data)을 제거하십시오. 이 작업은 수동으로 수행하거나 docker-compose rm 또는 docker volume rm을 통해 수행 할 수 있습니다. 제거하기 전에 해당 postgres 서비스에 첨부 된 볼륨을 확인하십시오. More info here

3) Docker는 이미지 빌드 및 실행을 통해 매우 우수한 캐시 관리를 사용합니다. Dockerfile을 수정하지 않았다면, 도커는 캐시에서 이미 빌드 된 이미지를 실행하여 실행하게됩니다.그래서 나는 postgres_service에 대한 이미지도 제거하는 것이 좋습니다.

목록에 이미지

docker images -a 

출력 -

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

가 (필요한 경우 -f 사용))

docker rmi IMAGE_ID_HERE 

4 해당 이미지를 삭제

docker-compose -f docker-compose-filename.yml up --build postgres_service 
다시 서비스를 다시 시작

이번에는 docker-entrypoint.shdump.sql이 실행됨을 알 수 있습니다.

관련 문제