Mi archivo de composición 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:
Por sugerencia de Nick, 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 el mío propio, ./database de datos?
¡Encontré la solución, gracias a Nick! (y otro amigo) Responda a continuación.
Por extraño que parezca, la solución terminó siendo cambiar
volumes: - ./postgres-data:/var/lib/postgresqlpara
volumes: - ./postgres-data:/var/lib/postgresql/data docker volume create pgdatao 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 de volumen pgdata y montará este volumen en la ruta del contenedor.
docker volume inspect pgdata // output will be [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/pgdata/_data", "Name": "pgdata", "Options": {}, "Scope": "local" } ]Evitaría usar una ruta relativa. Recuerde que docker es una relación demonio/cliente.
Cuando está ejecutando la redacción, básicamente se divide en varios comandos del cliente de la ventana acoplable, que luego se pasan al daemon. Esa ./database de datos es entonces relativa al daemon , no al cliente.
Ahora, el equipo de desarrollo de Docker tiene algunas idas y vueltas sobre este tema , pero la conclusión es que puede tener algunos resultados inesperados.
En resumen, no use una ruta relativa, use una ruta absoluta.