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 makemigrations
o de migrate
nuevo.
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.yml
docker-compose up -f path/to/docker-compose.yml
docker ps
Ahora ha iniciado sesión, luego vaya a la carpeta correcta:
cd path/to/django_app
Y ahora, cada vez que edite sus modelos, ejecute en su contenedor:
python manage.py makemigrations
ypython manage.py migrate
Tambié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,migrate
actualizaré 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
docker
jerarquí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,docker
se ejecutarán las migraciones antes de ejecutar el servidor; Mira que elmigration
servidor 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á antesweb
Haga 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 exec
comandofuente
docker ps
y luego busca la columna COMMAND para el servidor django.Si tienes algo como esto en tu
docker-compose.yml
Entonces 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.sh
script, ejecutado por Docker para iniciar su instancia? Solo le llevará unos segundos más.Nota : configuro la
DJANGO_SETTINGS_MODULE
variable 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