2015-05-05 8 views

Antwort

361

es herausgefunden, bash -c verwenden.

Beispiel:

command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000" 

Elbe Beispiel in Multilinien:

command: > 
    bash -c "python manage.py migrate 
    && python manage.py runserver 0.0.0.0:8000" 
+0

hat nicht für mich gearbeitet. – Pedram

+0

@Pedram verwenden Sie das Docker-Compose-Format der Version 2? – ecoding5

+1

@ ecoding5 Ja, ich benutze Version 2 – Pedram

14

Eine weitere Idee:

Wenn, wie in diesem Fall, können Sie die Container bauen gerade ein Startskript Platz darin und führe dies mit dem Befehl aus. Oder mounten Sie das Startskript als Volume.

+0

Yup, das funktioniert auch! –

+0

Ja, am Ende habe ich ein run.sh Skript: '' '#!/Bin/bash \ n Python manage.py migrieren \ n Python manage.py runserver 0.0.0.0: 8000''' (hässlich oneline) – fero

79

Ich laufe vor dem Start Sachen wie Migrationen in einem separaten ephemeren Behälter, wie so (beachten Sie, komponieren Datei hat von Version sein ‚2‘ Typ):

db: 
    image: postgres 
web: 
    image: app 
    command: python manage.py runserver 0.0.0.0:8000 
    volumes: 
    - .:/code 
    ports: 
    - "8000:8000" 
    links: 
    - db 
    depends_on: 
    - migration 
migration: 
    build: . 
    image: app 
    command: python manage.py migrate 
    volumes: 
    - .:/code 
    links: 
    - db 
    depends_on: 
    - db 

Diese Dinge sauber zu halten und trennen hilft . Zwei Dinge zu beachten:

  1. Sie haben die richtige Startreihenfolge zu gewährleisten (mit depends_on)

  2. Sie mehrere vermeiden wollen baut die Runde durch Tagging es das erste Mal erreicht wird unter Verwendung bauen und Bild; Sie Bild in anderen Behältern beziehen können dann

+1

Dies scheint die beste Option für mich zu sein, und ich würde es gerne verwenden. Können Sie Ihre Tagging-Einstellungen genauer ausführen, um mehrere Builds zu vermeiden? Ich würde es vorziehen, zusätzliche Schritte zu vermeiden, wenn das also etwas braucht, gehe ich mit "bash-c" weiter oben. –

+0

In der obigen Yaml passiert das Build und Tagging in der Migrationssektion. Es ist nicht wirklich auf den ersten Blick offensichtlich, aber docker-compose Tags, wenn Sie die Build-UND Bildeigenschaften angeben - wobei die Image-Eigenschaft das Tag für diesen Build angibt. Das kann dann verwendet werden, ohne einen neuen Build auszulösen (wenn Sie sich das Web anschauen, sehen Sie, dass es keinen Build, sondern nur eine Image-Eigenschaft hat). Hier sind einige weitere Details https://docs.docker.com/compose/compose-file/) –

+0

Das ist sehr informativ (und ich habe das in den Dokumenten völlig vermisst), danke. –

1

Verwenden Sie ein Werkzeug wie Warten-auf-es oder dockerize. Dies sind kleine Wrapper-Skripts, die Sie in das Bild Ihrer Anwendung einfügen können. Oder schreiben Sie Ihr eigenes Wrapper-Skript, um mehr anwendungsspezifische Befehle auszuführen. nach: https://docs.docker.com/compose/startup-order/

9

Hier können Sie den Einstiegspunkt verwenden. entrepoint in docker wird vor dem Befehl ausgeführt, while command ist der Standardbefehl, der beim Start des Containers ausgeführt werden soll. So führen die meisten Anwendungen die Setup-Prozedur in der Einstiegspunktdatei und in der letzten Ausführung des Befehls durch.

machen Sie eine Shell-Skript-Datei als docker-entrypoint.sh (Name ist egal) mit folgenden Inhalten darin.

#!/bin/bash 
python manage.py migrate 
exec "[email protected]" 

in Docker-compose.yml es Datei verwenden, mit entrypoint: /docker-entrypoint.sh und registrieren Befehl als command: python manage.py runserver 0.0.0.0:8000 P. S: vergessen Sie nicht, docker-entrypoint.sh zusammen mit Ihrem Code zu kopieren.

-5

versuchen Sie es mit ";" um die Befehle zu trennen, wenn Sie in Verionen sind zwei z.B.

command: "sleep 20; echo 'a'"

-1

Das ist zwar nicht ganz relevant für die Frage, Entsendung es hier einhüllen es jemand hilft. Wenn Sie vor dem Starten des Containers einen Befehl ausführen möchten, können Sie den Container normal ausführen. Melden Sie sich dann beim Container an und nehmen Sie die Änderungen vor. Sie können den Container dann als neues Bild festschreiben. Dieses neue Image kann verwendet werden, um sicherzustellen, dass alle erforderlichen Änderungen vor dem Starten des Containers vorhanden sind.

Verwandte Themen