2015-04-09 2 views
7

Ich bin ein Django-Projekt in AWS mit Elastic Beanstalk bereitstellen und bin bei der Migration der Datenbank fest.Django AWS Elastic Beanstalk migrieren Datenbank

Wo ich bin: Ich bin in der Lage, mein Django-Projekt erfolgreich zu implementieren und laden Sie die Seite über mysubdomain.elasticbeanstalk.com. Die Seite wird ohne Fehler geladen, bis ich zu einer Seite komme, die einen Datenbankaufruf durchführen muss. Ich bekomme dann einen Fehler wie relation "accounts_user" does not exist LINE 1: SELECT COUNT(*) FROM "accounts_user", weil meine Datenbank nicht migriert wurde.

Was ich versucht habe: Ich habe einige Variationen der Dinge ausprobiert. Glücklicherweise gibt es eine Fülle von Stackoverflow-Posts und ein paar Tutorials. Leider scheinen sie alle eine andere Version zu verwenden und was sie vorschlagen, trifft nicht auf mein Projekt zu.

Es ist ziemlich klar für mich, dass ich die Migration in einer foobar.config Datei im Ordner .ebextensions/ ausführen muss. Hier ist die Basis dessen, was ich tun möchte:

container_commands: 
    01_migrate: 
    command: "python manage.py migrate --noinput" 
    leader_only: true 

In den Protokollen, wie ich sehe, dass die nach der Bereitstellung Skript auszuführen versucht, aber es ist fehlgeschlagen. Ich bekomme keine weiteren Informationen über den Fehler, die einzige Sache, die ich sehe, ist etwas wie "FEHLER: 01_migrate nach der Bereitstellung Skript fehlgeschlagen"

Ich finde heraus, dass ich die virtuelle Umgebung für den Befehl aktivieren muss, was macht Sinn. Von asdf versuche ich das:

container_commands: 
    01_migrate: 
    command: "source /opt/python/run/venv/bin/activate && python rlg/manage.py migrate --noinput" 
    leader_only: true 

Aber es funktioniert nicht. In der Tat, durch SSH finde ich heraus, ich habe nicht einmal einen/opt/python/Ordner, nur/opt/aws/und/opt/elasticbeanstalk /. Alle Tutorials und SO Fragen beziehen sich auf diesen Ordner, aber ich habe es nicht?

BAUVARIANTEN: Python 3.4.1, Django 1.7.7, AWS CLI 3.2.1, Postgres 9.3

+1

Ich bin am selben Ort stecken. Was ich herausgefunden habe: Die container_commands werden NICHT innerhalb des Docker-Containers ausgeführt. Sie werden auf der ec2-Instanz selbst ausgeführt. Ich denke, wir müssen die Migration mit etwas wie "docker exec [container_name]/var/app/bin/python manage.py migration - noinput Leider habe ich immer noch Schwierigkeiten, die richtige [container_name] –

+0

@SebastianAnnies genial Ich bin froh, dass ich jemanden an der gleichen Stelle gefunden habe Danke für den Tipp Ich werde auch daran arbeiten und dich wissen lassen, was ich finde – awwester

Antwort

9

Die container_commands nicht innerhalb der Docker Container ausgeführt. Sie werden direkt auf der ec2-Instanz ausgeführt. Derzeit verwende ich docker exec, um die Migration durchzuführen. Da der betroffene Docker-Container afaik ist, habe ich die letzte docker ps -a --no-trunc -q | head -n 1 verwendet, um die Container-ID zu erhalten.

Am Ende sieht mein setup.config wie die

container_commands: 
    01syncdb: 
    command: "docker exec `docker ps -a --no-trunc -q | head -n 1` /var/app/bin/python /var/app/manage.py syncdb --noinput &>> /tmp/deploy.log" 
    leader_only: true 
    02migrate: 
    command: "docker exec `docker ps -a --no-trunc -q | head -n 1` /var/app/bin/python /var/app/manage.py migrate --noinput &>> /tmp/deploy.log" 
    leader_only: true 

Ich hoffe, dass Ihr Problem auch gelöst werden.

+0

Nur lesen: https://forums.aws.amazon.com/ann.jspa? annID = 2982 Wir hätten uns das Problem ersparen können ... –

+0

funktioniert Danke – awwester

+0

Ich habe es versucht, aber ich habe bemerkt, dass es meinen alten Container bekommt und nicht mein neuer! Hat noch jemand dieses Problem gesehen? Ich habe einen leicht modifizierten, aber gleichwertigen Befehl von: '" CONTAINER = \ docker ps -a --no-trunc | versucht grep aws_beanstalk | Schnitt -d '' -f1 | head -1 \ '&& docker exec $ CONTAINER python3 manage.py migrieren" ' – MrColes

10

Ich weiß, das ist ein alter Beitrag, aber ich möchte meine Antwort hier posten, da es ziemlich lange gedauert hat, bis ich herausgefunden habe.

Sebastian Art wies mich in die richtige Richtung, aber das Problem bei diesem Ansatz ist es läuft, bevor der Einsatz (so wandern Sie den alten Code)

Sie können auch den files Befehl in ebextensions verwenden und eine Datei schreiben/opt/elasticbeanstalk/hooks/AppDeploy/Post, aber das wird auf immer Instanz laufen

Sie diese beiden Dinge in kombinieren:

container_commands: 
    01migrate: 
    command: "mkdir -p /opt/elasticbeanstalk/hooks/appdeploy/post/ && echo -e '#!/bin/bash\ndocker exec `docker ps -a -q | head -n 1` python <path_to_code> migrate' > /opt/elasticbeanstalk/hooks/appdeploy/post/99_migrate.sh && chmod +x /opt/elasticbeanstalk/hooks/appdeploy/post/99_migrate.sh" 
    leader_only: true 

Dies erzeugt einen Beitrag deploy Skript in der richtigen di r und nur auf den Anführer.

wirklich gut für mich Dies funktioniert aber sind die Haken gewarnt werden Verzeichnisse un dokumentierte Funktionen

-1

Informationen Aktualisierung in Bezug auf neueste Version Elastic Beanstalk.

Ich benutze 64bit Amazon Linux 2016.09 v2.3.3 running Python 3.4.

Der folgende Befehl funktioniert für mich, ohne die virtualenv aktivieren oder erstellen Sie eine Post App Deploy-Hook.

container_commands: 
    01_migrate_db: 
    command: "python manage.py db upgrade" <-- insert your migration command here 
    leader_only: true 

Um zu beweisen, dass die container commands auf einem Pfosten deploy Phase ausgeführt wird, machte ich eine Änderung an meine Modelle, erzeugt die Skripte Migrationen aktualisiert, eingesetzt, um die neue Version und überprüft, ob die Datenbank sehen erfolgreich migriert wurde : Erfolg!

+1

Das liegt daran, dass Sie Ihre django-App nicht in einem Docker-Container ausführen, sondern eher in Python 3.4-Image.In einem Setup mit Docker ist das anders (siehe Kommentare zum Ausführen eines Befehls in der letzte Andock-Container) Dies ist ein Problem speziell für Docker-Umgebungen. – yellowcap