볼륨을 사용하여 도킹된 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
'programing' 카테고리의 다른 글
C#에서 내가 있는 페이지의 전체 URL을 얻으려면 어떻게 해야 합니까? (0) | 2023.05.12 |
---|---|
SQL Azure에서 쿼리 실행이 훨씬 느린 이유는 무엇입니까? (0) | 2023.05.12 |
Http 메서드에서 생성된 관찰 가능 항목의 구독을 취소할 필요가 있습니까? (0) | 2023.05.07 |
Blob에 저장된 미디어 파일의 내용 유형 설정 (0) | 2023.05.07 |
응답 이유.리디렉션으로 인해 시스템이 발생합니다.스레드화.스레드 중단 예외? (0) | 2023.05.07 |