programing

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

lastcode 2023. 5. 7. 11:30
반응형

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

나의 도커 컴포지트 파일은 web, nginx, postgres 3개의 컨테이너로 구성되어 있습니다.포스트그레스는 다음과 같습니다.

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

내 목표는 로컬 폴더에 해당하는 볼륨을 마운트하는 것입니다../database포스트그레스 용기 안에/var/lib/postgres이 컨테이너들을 시작하고 포스트그레스에 데이터를 삽입할 때, 나는 다음을 확인합니다./var/lib/postgres/data/base/(포스트그레스 컨테이너에) 추가하는 데이터로 가득 차 있지만, 로컬 시스템에서는./database오직 a만 받음data그 안에 있는 폴더, 즉../database/data생성되었지만 비어 있습니다. 왜죠?

주의:

업데이트 1

닉의 제안에 따라, 나는 했습니다.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": ""
        }
    ],

제가 직접 코딩하지 않은 다른 볼륨에 의해 데이터가 도용되는 것처럼 보입니다.왜 그런지 모르겠어요.포스트그레스 이미지가 저를 위해 그 볼륨을 만들고 있습니까?그렇다면 다시 시작할 때 탑재하는 볼륨 대신 해당 볼륨을 사용할 수 있는 방법이 있습니까?아니면 다른 볼륨을 비활성화하고 내 볼륨을 사용할 수 있는 좋은 방법이 있습니까?./database?

이상하게도, 해결책은 결국 변화하는 것이었습니다.

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

로.

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

모든 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"
    }
]

저는 상대 경로를 사용하지 않을 것입니다.도커는 데몬/클라이언트 관계입니다.

컴포지트를 실행할 때는 기본적으로 다양한 도커 클라이언트 명령으로 분할된 다음 데몬으로 전달됩니다.그거./database그러면 클라이언트가 아니라 데몬에 상대적입니다.

도커 개발 팀은 이 문제에 대해 앞뒤로 의견을 달리하지만 결론은 예상치 못한 결과를 초래할 수 있다는 것입니다.

즉, 상대 경로를 사용하지 말고 절대 경로를 사용합니다.

먼저 도커 외부에 볼륨을 생성하면 됩니다.docker create -v /location --name재사용할 수 있습니다.

그리고 제가 도커를 많이 사용했을 때 도커 파일 정의가 있는 정적 도커 볼륨을 사용할 수 없었기 때문에 (결국 스크립트를 사용하여) 명령줄을 사용해 보는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/41637505/how-to-persist-data-in-a-dockerized-postgres-database-using-volumes

반응형