una remota por nube instancia ejemplos datos crear consola configurar conectar aws postgresql docker docker-compose docker-volume

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:

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