볼륨을 사용하여 고정 된 postgres 데이터베이스에 데이터를 유지하는 방법


205

내 docker compose 파일에는 web, nginx 및 postgres의 세 가지 컨테이너가 있습니다. Postgres는 다음과 같습니다 :

postgres:
  container_name: postgres
  restart: always
  image: postgres:latest
  volumes:
    - ./database:/var/lib/postgresql
  ports:
    - "5432:5432

내 목표는 ./databasepostgres 컨테이너 내부 에있는 로컬 폴더에 해당하는 볼륨을로 마운트하는 것 /var/lib/postgres입니다. 이 컨테이너를 시작하고 postgres에 데이터를 삽입 /var/lib/postgres/data/base/하면 postgres 컨테이너에 추가하는 데이터로 가득 차 있지만 로컬 시스템에서는 폴더 ./database만 가져 data옵니다. 즉 ./database/data비어 있습니다. . 왜?

노트:

업데이트 1

Nick의 제안에 따라 나는 다음 docker inspect을 발견했다.

    "Mounts": [
        {
            "Source": "/Users/alex/Documents/MyApp/database",
            "Destination": "/var/lib/postgresql",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },
        {
            "Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
            "Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
            "Destination": "/var/lib/postgresql/data",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }
    ],

내가 코딩하지 않은 다른 볼륨에 의해 데이터가 도난당한 것처럼 보입니다. 왜 그런지 잘 모르겠습니다. postgres 이미지가 해당 볼륨을 생성합니까? 그렇다면 다시 시작할 때 마운트 하는 볼륨 대신 해당 볼륨 을 사용 하는 방법이 있습니까? 그렇지 않으면 다른 볼륨을 비활성화하고 내 볼륨을 사용하는 좋은 방법이 ./database있습니까?

업데이트 2

Nick 덕분에 해결책을 찾았습니다! (및 다른 친구) 아래에 답변하십시오.


initdb데이터베이스 클러스터를 초기화하기 위해 명령 행을 이미 실행하고 있습니까?
Sebastian Webber

데이터 서브 디렉토리가 실제로 비어 있습니까? 특별한 액세스 권한이있을 수 있습니다.
Yaroslav Stavnichiy 2016 년

너무 빨리 연락해 주셔서 감사합니다! 나는 그래서, 플라스크 응용 프로그램을 사용하고 있습니다 from app import dbdb.create_all()A로부터 docker run컨테이너를 시작한 후. 나는 initdb커맨드 라인에서 직접 하지 않습니다 .
Alex Lenail

1
@YaroslavStavnichiy 나는 그것을 확인 sudo su -하고 찾는 다른 방법을 모른다 ./database/data. 내가 말할 수있는 한 아무것도 없습니다.
Alex Lenail

, 포스트 그레스, 탄성 검색 및 미디어 데이터를 지속 샘플 작성 파일 : 사람이 유용하게 찾을 수 stackoverflow.com/a/56475980/5180118
ArdentLearner

답변:


253

이상하게도 솔루션은 바뀌게되었습니다.

volumes:
  - ./postgres-data:/var/lib/postgresql

volumes:
  - ./postgres-data:/var/lib/postgresql/data

45
이 답변에 대한 빠른 "왜"(작동). postgres 사람들에 따라 기본 데이터 디렉토리는 /var/lib/postgresql/data다음과 같습니다. PGDATA 변수 노트는 다음에서 읽을 수 있습니다. store.docker.com/images/…
Matt Pavelle

2
위의 질문에서 OP는 마지막에 / data없이 그를 위해 일했다고 말합니다. 그 맞습니까?
Sid

2
그리고 .dockerignore특히 로컬 이미지를 프로덕션 이미지로 잘라내는 경우 파일에 로컬 디렉토리를 추가하십시오 . 토론 은 codefresh.io/blog/not-ignore-dockerignore 를 참조하십시오 .
dsz December

4
이것은 여전히 ​​나를 위해 작동하지 않습니다 (mac os x high sierra)
olidem

1
@ OlliD-Metz 나는 docker rm my_postgres_container_1그것이 일하기 전에 (또한 High Sierra)해야했습니다.
rich

100

모든 Postgres 데이터에 대한 공통 볼륨 을 생성 할 수 있습니다

 docker volume create pgdata

또는 작성 파일로 설정할 수 있습니다

   version: "3"
   services:
     db:
       image: postgres
       environment:
         - POSTGRES_USER=postgres
         - POSTGRES_PASSWORD=postgress
         - POSTGRES_DB=postgres
       ports:
         - "5433:5432"
       volumes:
         - pgdata:/var/lib/postgresql/data
       networks:
         - suruse
   volumes: 
     pgdata:

볼륨 이름 pgdata 를 생성 하고이 볼륨을 컨테이너 경로에 마운트합니다.

이 볼륨을 검사 할 수 있습니다

docker volume inspect pgdata

// output will be
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
        "Name": "pgdata",
        "Options": {},
        "Scope": "local"
    }
]

8
조금 늦게 주석을 달았지만 내가 할 경우이 명확한 데이터는 아닙니다 docker-compose down -v. 그리고 그 해결책은 무엇입니까?
Sid

3
@Sid, 그렇습니다! 이 옵션에주의하십시오.
olidem

1
docker-compose [down]으로 볼륨이 더 이상 유지되지 않습니까? 볼륨도 완전히 정리합니까?
Paul

2
심지어 나중에 언급 @Sid,하지만 당신은 할 수 사용 docker-compose down --rmi all 하지 않고-v 옵션이 "모든"지울거야 제외하고 볼륨, 즉 용기, 네트워크, 이미지 등 내가 할 데이터 지속성을 허용하면서 배포 할 때.
code_dredd

13

상대 경로를 사용하지 마십시오. docker는 데몬 / 클라이언트 관계입니다.

작성을 실행할 때 기본적으로 다양한 도커 클라이언트 명령으로 분류되어 데몬으로 전달됩니다. 그러면 클라이언트가 아닌 데몬./database관련이 있습니다.

이제 docker dev 팀은이 문제에 대해 앞뒤로 이야기하지만 결론은 예기치 않은 결과를 초래할 수 있다는 것입니다.

즉, 상대 경로를 사용하지 말고 절대 경로를 사용하십시오.


이 답변에 감사드립니다! 슬프게도, 나는 그것이 효과가 있다고 생각하지 않습니다. 줄을 절대 경로로 변경하고 데이터를 삽입 한 후에도 database/data폴더가 비어 있습니다 = (
Alex Lenail

K. 다음 docker inspect은 컨테이너 에서 실행 하여 컨테이너가 볼륨을 인식하는지 확인하십시오 (구성이 혼란 스러울 때 등). (참고 : docker inspect는 민감한 데이터를 가질 수 있으므로 munging없이 여기에 붙여 넣지 마십시오. ;-) 그 후 권한을 확인해야합니다 (일반적으로 오류가 표시 될지라도)
Nick Burke

아하! @ 닉 버크 당신이 뭔가를 찾은 것 같아요. 질문을 업데이트했습니다.
Alex Lenail

2

먼저 도커 외부에서 볼륨을 생성 docker create -v /location --name한 다음 재사용 해야한다고 생각 합니다.

그리고 docker를 많이 사용했을 때 dockerfile 정의와 함께 정적 docker 볼륨을 사용할 수 없었기 때문에 명령 줄을 시도하는 것이 좋습니다 (결국 스크립트 사용).


0

며칠 동안 같은 문제가있었습니다. 내 경우는 단순히 오타였습니다 : "postgresql"에는 하나의 "s"만 쓰면 2 (postgressql) : $입니다.


질문 한 오타가 질문에 나타나지 않는 경우 질문을 한 사람에 대해 동일한 오타가 발생했다고 생각하는 이유는 무엇입니까?
Jason Aller

이것은 실제로 질문에 대답하지 않습니다. 다른 질문이 있으면 질문하기를 클릭하여 질문 할 수 있습니다 . 당신은 또한 충분한 명성을 얻은 후에이 질문에 더 많은 관심을 끌기 위해 현상금추가 할 수 있습니다 . - 리뷰에서
Willie Cheng
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.