2016-05-06 1 views
4

Ich bin Neuling in Docker-Compose und ich habe ein Docker mit meiner Django-Instanz und einer MySQL-Datenbank. Ich möchte einen selbstautokonfigurierten Container erstellen, der nur beim ersten Docker-Lauf einen Befehl ausführt. In diesem Befehl würde Ich mag die folgenden Aufgaben:Init Django App mit Docker-komponieren

  1. anfängliche Datenbankmigrationen
  2. macht die Admin Super-User erstellen
  3. Import einen MySQL-Backup in die Datenbank

Danach sollte das System Lanciere weiterhin den django test Webserver.

Gibt es eine Möglichkeit, docker-compose anzuweisen, einen Befehl nur bei der ersten Ausführung auszuführen, oder gibt es eine Alternative in django, um zu steuern, ob das System bereits konfiguriert und aktualisiert wurde?

Um hier sind meine dockfile und Docker-compose.yml zu klären:

FROM python:3.4 
ENV PYTHONUNBUFFERED 1 
RUN mkdir /code 
WORKDIR /code 
ADD requirements.txt /code/ 
RUN pip install -r requirements.txt 
ADD . /code/ 

#################### 

version: '2' 
services: 
db: 
    image: "mysql:5.6" 
    ports: 
    - 3306:3306 
    environment: 
    MYSQL_ROOT_PASSWORD: xxxxxx 
    MYSQL_DATABASE: xxxxxx 
    MYSQL_USER: xxxxx 
    MYSQL_PASSWORD: xxxxxxx 
web: 
    build: . 
    command: python manage.py runserver 0.0.0.0:8000 
    volumes: 
    - .:/code 
    ports: 
    - "8000:8000" 
    depends_on: 
    - db 

Dank.

+0

Sie könnten Ihre eigene Dockerfile rollen, um diese Befehle auszuführen –

+0

@ cricket_007 Ich weiß nicht wirklich, ob eine einfache Änderung der Dockerdatei funktioniert, weil ich die Datenbank als unabhängiges Bild von meinem Django benutze. – rdiaz82

+0

Ich verstehe das. Ich habe gesagt, dass Sie einen Datenbankcontainer (getrennt von Django) mit einer Ebene erstellen, auf der Ihre Skripts und Importe laufen. Nachdem Sie ein Bild haben, ist Docker nicht wirklich entworfen, um "etwas nur einmal auszuführen" (d. H. Stateful). Das ist zumindest meine Erfahrung –

Antwort

5

Nach den Kommentaren von @ cricket_007 habe ich endlich eine knifflige Lösung gefunden, um das Problem zu lösen. Ich habe ein SH-Skript für den Datenbankservice und für meinen Webservice erstellt. Zusätzlich habe ich zwei Versionsdateien in meinem Ordner web_local.version und web_server.version erstellt.

Die Datei web_local.version wurde zu meinem .gitignore hinzugefügt, da diese Datei zum Speichern der aktuellen App-Version verwendet wird.

Das Skript start_web.sh ist ein einfaches Skript, das vergleicht, ob der Ordner eine web_local.version-Datei enthält. In diesem Fall wurde das Projekt in der Vergangenheit konfiguriert und das Skript überprüft, ob die aktuelle App-Version im Vergleich zur Server-Version aktualisiert wird. Wenn alles auf dem neuesten Stand ist, führen Sie einfach einen Webserver aus, führen Sie andernfalls eine Migration aus, um die Modelle zu aktualisieren, und führen Sie dann den Webserver aus.

Hier ist die web_start.sh Skript für Referenzen:

#!/bin/bash 

FILE="web_local.version" 

if [ -f "$FILE" ]; 
then 
    echo "File $FILE exist." 
    if diff ./web_server.version ./web_local.version > /dev/null; 
    then 
     echo "model version up to date :)" 
    else 
     echo "model updated!!" 
     python manage.py migrate 
     cp ./web_server.version ./$FILE 
    fi 
else 
    echo "File $FILE does not exist" 
    sleep 10 #added because the first time db take a long time to init and the script doesn't wait until db is finished 
    cp ./web_server.version ./$FILE 
    python manage.py migrate 
fi 
python manage.py runserver 0.0.0.0:8000 

Ich nehme an, dass es mehr formalen Lösungen sind aber diese Lösungen ist für meinen Fall funktional, weil es unserem Team ermöglicht, die gleiche Mock-Datenbank und derselben zu halten Modelle über Git synchronisiert und wir haben eine Null Zeit Konfigurationsumgebung läuft nur mit einem Befehl.