Korzystanie z Docker-Compose, jak wykonywać wiele poleceń

Chcę zrobić coś takiego, gdzie mogę uruchomić wiele poleceń w kolejności.

db:
  image: postgres
web:
  build: .
  command: python manage.py migrate
  command: python manage.py runserver 0.0.0.0:8000
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - db
Author: Rusty Shackleford, 2015-05-06

9 answers

Rozgryzłem to, użyłem bash -c.

Przykład:

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

Ten sam przykład w wielowierszach:

command: >
    bash -c "python manage.py migrate
    && python manage.py runserver 0.0.0.0:8000"
 475
Author: Rusty Shackleford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-22 23:50:49

Uruchamiam przed uruchomieniem takie rzeczy jak migracje w oddzielnym, efemerycznym kontenerze, jak tak (Uwaga, plik compose musi być typu '2'):

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
To pomaga rzeczy utrzymać czystość i oddzielenie. Dwie rzeczy do rozważenia:
  1. Musisz zapewnić prawidłową sekwencję uruchamiania (używając depends_on)

  2. Chcesz uniknąć wielu kompilacji, które można uzyskać, oznaczając je za pierwszym razem za pomocą kompilacji i obrazu; możesz odwołać się do obrazu w innych kontenerach then

 101
Author: Bjoern Stiel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 06:37:39

Inny pomysł:

Jeśli, tak jak w tym przypadku, zbudujesz kontener, po prostu umieść w nim skrypt startowy i uruchom go za pomocą polecenia. Lub zamontuj skrypt startowy jako wolumin.

 16
Author: rweng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-09 19:30:50

Możesz użyć entrypoint tutaj. entrypoint w dockerze jest wykonywany przed poleceniem, podczas gdy command jest domyślnym poleceniem, które powinno być uruchamiane podczas uruchamiania kontenera. Tak więc większość aplikacji zazwyczaj przeprowadza procedurę konfiguracji w pliku entrypoint, a w ostatnim pozwalają na uruchomienie polecenia.

Plik skryptu powłoki może mieć postać docker-entrypoint.sh (nazwa nie ma znaczenia) z następującą zawartością.

#!/bin/bash
python manage.py migrate
exec "$@"

W docker-compose.plik yml użyj go z entrypoint: /docker-entrypoint.sh i zarejestruj polecenie jako command: python manage.py runserver 0.0.0.0:8000 P. s: do nie zapomnij skopiować docker-entrypoint.sh wraz z kodem.

 14
Author: Harshad Yeola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-06 08:30:03

Jeśli potrzebujesz uruchomić więcej niż jeden proces demona, w dokumentacji Dockera jest sugestia użycia Supervisord w trybie niezwiązanym, więc wszystkie demony podrzędne będą wysyłane na stdout.

Z innego więc pytanie, odkryłem, że można przekierować wyjście procesów potomnych na stdout. w ten sposób można zobaczyć wszystkie wyjścia!

 1
Author: Tim Tisdall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:47

Użyj narzędzia takiego jak wait-for-it lub dockerize . Są to małe Skrypty opakowujące, które można umieścić w obrazie aplikacji. Możesz też napisać własny skrypt wrappera, aby wykonać polecenia bardziej specyficzne dla aplikacji. według: https://docs.docker.com/compose/startup-order/

 1
Author: Eran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 11:46:55

Zalecam użycie sh w przeciwieństwie do bash, ponieważ jest on łatwiej dostępny na większości obrazów opartych na Uniksie (alpine, itp.).

Oto przykład docker-compose.yml:

version: '3'

services:
  app:
    build:
      context: .
    command: >
      sh -c "python manage.py wait_for_db &&
             python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8000"

Spowoduje to wywołanie następujących poleceń w kolejności:

  • python manage.py wait_for_db - Poczekaj, aż db będzie gotowe
  • python manage.py migrate - Uruchom dowolne migracje
  • python manage.py runserver 0.0.0.0:8000 - Uruchom mój serwer programistyczny
 1
Author: Mark Winterbottom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 07:41:51

Choć nie jest to do końca istotne dla pytania, zamieszczając go tutaj, to komuś pomaga. Jeśli chcesz uruchomić polecenie przed uruchomieniem kontenera, możesz go uruchomić normalnie. Następnie zaloguj się do kontenera i wprowadź zmiany. Kontener można zatwierdzić jako nowy obraz. Ten nowy obraz może być użyty, aby upewnić się, że wszystkie niezbędne zmiany istnieją przed uruchomieniem kontenera.

 -3
Author: user3229050,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-17 16:44:41

Spróbuj użyć";", aby oddzielić polecenia, jeśli jesteś w wersji 2 np.

command: "sleep 20; echo 'a'"

 -6
Author: chanllen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-13 00:11:06