Pregunta Cómo persistir datos en una base de datos postgres dockerized utilizando volúmenes


El archivo de redacción de mi 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 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 postgres), pero en mi sistema local, ./database solo obtiene un data carpeta en él, es decir ./database/data se crea, pero está vacío. ¿Por qué?

Notas:

ACTUALIZACIÓN 1

Por sugerencia de Nick, hice un docker inspect y encontrado:

    "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 me codifiqué. 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 desactivar ese otro volumen y usar el mío, ./database?

ACTUALIZACIÓN 2

¡Encontré la solución, gracias a Nick! (y otro amigo) Responda a continuación.


73
2018-01-13 15:02


origen


Respuestas:


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

115
2018-01-14 14:10



Puedes crear un campo común volumen para todos los datos de Postgres

 docker volume create pgdata

o puede configurarlo en el archivo de composició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 monte este volumen a 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"
    }
]

29
2017-08-10 06:51



Evitaría usar una ruta relativa. Recuerde que Docker es una relación daemon / cliente.

Cuando está ejecutando la compilación, básicamente se trata de dividir en varios comandos del cliente de Docker, que luego se pasan al daemon. Ese ./database es relativo a la demoniono el cliente

Ahora, el equipo de desarrollo de docker tiene algunos problemas 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.


3
2018-01-13 18:43



Creo que solo necesitas crear tu volumen fuera del acoplador primero con un docker create -v /location --name y luego reutilizarlo.

Y cuando solía usar mucho Docker, no era posible usar un volumen de acoplador estático con definición de archivo docker, así que mi sugerencia es probar la línea de comando (eventualmente con un script).


1
2018-01-13 23:40