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
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"
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:
-
Musisz zapewnić prawidłową sekwencję uruchamiania (używając depends_on)
-
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
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.
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.
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!
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/
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
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.
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'"
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