postgresql - remota - Cómo conservar datos en una base de datos postgres dockerizada usando volúmenes
crear instancia postgresql windows (4)
Puede crear un volumen común para todos los datos de Postgres
docker volume create pgdata
o puede configurarlo en el archivo de redacción
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:
Creará el nombre del volumen pgdata y montará este volumen en la ruta del contenedor.
Puedes inspeccionar este volumen
docker volume inspect pgdata
// output will be
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
"Name": "pgdata",
"Options": {},
"Scope": "local"
}
]
Mi archivo de compilación de Docker tiene tres contenedores, web, nginx y postgres. Postgres se ve así:
postgres:
container_name: postgres
restart: always
image: postgres:latest
volumes:
- ./database:/var/lib/postgresql
ports:
- "5432:5432
Mi objetivo es montar un volumen que corresponda a una carpeta local llamada
./database
dentro del contenedor de postgres como
/var/lib/postgres
.
Cuando inicio estos contenedores e inserto datos en postgres, verifico que
/var/lib/postgres/data/base/
está lleno de los datos que estoy agregando (en el contenedor de postgres), pero en mi sistema local,
./database
solo obtiene una carpeta de
data
, es decir, se crea
./database/data
, pero está vacío.
¿Por qué?
Notas:
- Esto sugiere que mi archivo anterior debería funcionar.
- Esta persona está usando los servicios de Docker, lo cual es interesante
ACTUALIZACIÓN 1
Según la sugerencia de Nick, hice una
docker inspect
y encontré:
"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": ""
}
],
Lo que hace que parezca que los datos están siendo robados por otro volumen que no codifiqué yo mismo.
No estoy seguro de por qué es eso.
¿La imagen de postgres está creando ese volumen para mí?
Si es así, ¿hay alguna forma de usar
ese volumen en
lugar del volumen que estoy montando cuando reinicio?
De lo contrario, ¿hay una buena manera de deshabilitar ese otro volumen y usar mi propio
./database
?
ACTUALIZACIÓN 2
Encontré la solución, gracias a Nick! (y otro amigo) Responde a continuación.
Creo que solo necesita crear su volumen fuera de la ventana acoplable primero con una
docker create -v /location --name
y luego reutilizarlo.
Y cuando solía usar mucho docker, no era posible usar un volumen de docker estático con definición de dockerfile, por lo que mi sugerencia es probar la línea de comando (eventualmente con un script).
Evitaría usar una ruta relativa. Recuerde que docker es una relación demonio / cliente.
Cuando está ejecutando la composición, esencialmente se divide en varios comandos de cliente de Docker, que luego se pasan al demonio.
Ese
./database
es entonces relativo al
daemon
, no al cliente.
Ahora, el equipo de desarrollo de Docker tiene algo de ida y vuelta en este tema , pero la conclusión es que puede tener algunos resultados inesperados.
En resumen, no use una ruta relativa, use una ruta absoluta.
Por extraño que parezca, la solución terminó siendo cambiar
volumes:
- ./postgres-data:/var/lib/postgresql
a
volumes:
- ./postgres-data:/var/lib/postgresql/data