He configurado una aplicación Docker Django / PostgreSQL siguiendo de cerca las instrucciones de inicio rápido de Django en el sitio de Docker .
La primera vez que ejecuto manage.py migrate de Django, usando el comando sudo docker-compose run web python manage.py migrate, funciona como se esperaba. La base de datos está construida dentro del contenedor Docker PostgreSQL muy bien.
Los cambios realizados en la propia aplicación Django también se reflejan en el contenedor Docker Django, en el momento en que los guardo. ¡Es genial!
Pero si luego cambio un modelo en Django e intento actualizar la base de datos de Postgres para que coincida con el modelo, no se detectan cambios, por lo que no se produce ninguna migración, sin importar cuántas veces lo ejecute makemigrationso de migratenuevo.
Básicamente, cada vez que cambio el modelo de Django, tengo que eliminar los contenedores de Docker (usando sudo docker-compose rm) y comenzar de nuevo con una nueva migración.
Todavía estoy tratando de entender a Docker, y hay muchas cosas que no entiendo sobre cómo funciona, pero este me está volviendo loco. ¿Por qué migrar no ve mis cambios? ¿Qué estoy haciendo mal?
fuente

You just have to log into your running docker container and run your commands.pero ¿cuál es la razón por la que se comporta de esa manera? @LouisBarranqueiroRespuestas:
Solo tiene que iniciar sesión en su contenedor docker en ejecución y ejecutar sus comandos.
docker-compose build -f path/to/docker-compose.ymldocker-compose up -f path/to/docker-compose.ymldocker psAhora ha iniciado sesión, luego vaya a la carpeta correcta:
cd path/to/django_appY ahora, cada vez que edite sus modelos, ejecute en su contenedor:
python manage.py makemigrationsypython manage.py migrateTambién le recomiendo que use un punto de entrada de docker para que su archivo contenedor de docker de django se ejecute automáticamente:
Aquí hay un ejemplo (
docker-entrypoint.sh):fuente
makemigrations. la próxima vez que lance mi pila,migrateactualizaré la base de datos con las últimas migraciones deshechas, de lo contrario, la aplicación django no funcionará correctamente ... Es solo un acceso directo en dev env para asegurarse de que tiene el esquema de base de datos correcto con la aplicación actualYo uso estos métodos:
Usando la
dockerjerarquía que hicimos, la migración del servicio se ejecuta después de configurar la base de datos y antes de ejecutar el servicio principal. Ahora, cuando ejecute su servicio,dockerse ejecutarán las migraciones antes de ejecutar el servidor; Mira que elmigrationservidor se aplica sobre la misma imagen que el servidor web, significa que todas las migraciones serán tomadas de tu proyecto, evitando problemas.De esta forma evitas hacer punto de entrada o cualquier otra cosa.
fuente
build: .funciona?image:Recibo el error de que la migración no puede extraer la imagen nombradabuild:sobremigration, ya que se ejecutará anteswebHaga que su pila se ejecute y luego ejecute un comando de ejecución de docker-compose de un solo disparo. P.ej
Esto funciona muy bien para la base de datos SQLite incorporada (predeterminada), pero también para una base de datos externa acoplada que aparece como dependencia. Aquí hay un ejemplo de archivo docker-compose.yaml
https://docs.docker.com/compose/reference/run/
fuente
Puedes usar el
docker execcomandofuente
docker psy luego busca la columna COMMAND para el servidor django.Si tienes algo como esto en tu
docker-compose.ymlEntonces puedes simplemente ejecutar ...
fuente
Sé que esto es antiguo, y tal vez me falta algo aquí (si es así, ¡ilumíneme!), Pero ¿por qué no agregar los comandos a su
start.shscript, ejecutado por Docker para iniciar su instancia? Solo le llevará unos segundos más.Nota : configuro la
DJANGO_SETTINGS_MODULEvariable para asegurarme de que se utiliza la base de datos correcta, ya que utilizo diferentes bases de datos para el desarrollo y la producción (aunque sé que esto no es la "mejor práctica").Esto me lo resolvió:
fuente
Al usar Docker Exec, recibí el siguiente error:
Entonces usé este comando en su lugar:
fuente