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 data
carpeta, ./database/data
es decir, se crea, pero está vacío . ¿Por qué?
Notas:
- Esto sugiere que mi archivo anterior debería funcionar.
- Esta persona está utilizando 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 desactivar ese otro volumen y usar el mío ./database
?
ACTUALIZACIÓN 2
Encontré la solución, gracias a Nick! (y otro amigo) Responde a continuación.
fuente
initdb
línea de comando para inicializar el clúster de su base de datos?from app import db
ydb.create_all()
desdedocker run
después de comenzar los contenedores. No lo hagoinitdb
directamente desde la línea de comando.sudo su -
y mirar./database/data
. No hay nada allí por lo que puedo decir.Respuestas:
Por extraño que parezca, la solución terminó siendo cambiar
a
fuente
/var/lib/postgresql/data
: puede leer las notas de la variable PGDATA aquí: store.docker.com/images/….dockerignore
archivo, especialmente si alguna vez lo convertirá en una imagen de producción. Ver codefresh.io/blog/not-ignore-dockerignore para una discusión.docker rm my_postgres_container_1
antes de que funcionara (también High Sierra).Puede crear un volumen común para todos los datos de Postgres
o puede configurarlo en el archivo de redacción
Creará el nombre del volumen pgdata y montará este volumen en la ruta del contenedor.
Puedes inspeccionar este volumen
fuente
docker-compose down -v
. ¿Y cuál es la solución a eso?docker-compose down --rmi all
sin la-v
opción y eliminará "todo" excepto los volúmenes, es decir, contenedores, redes, imágenes, etc. Lo hago cuando lo despliego mientras permito la persistencia de los datos.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. Eso
./database
es relativo al demonio , no al cliente.Ahora, el equipo de desarrollo de Docker tiene algunas dudas 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.
fuente
database/data
carpeta todavía está vacía = (docker inspect
en el contenedor y asegurarse de que el contenedor esté al tanto del volumen (en caso de que la composición esté confundida o algo así). (nota: docker inspeccionar puede tener datos confidenciales, así que no los pegue aquí sin molestarlos ;-) Después de eso, es cuestión de verificar los permisos (aunque eso generalmente mostraría un error)Creo que solo necesita crear su volumen fuera de la ventana acoplable 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 docker estático con definición de dockerfile, por lo que mi sugerencia es probar la línea de comandos (eventualmente con un script).
fuente