Jak Udržet Služba Běží v odděleném Kontejneru? [uzavřeno]

0

Otázka

Pomocí docker nasazení uvicorn server sloužit některé tensorflow model. Konec dockerfile vypadá takhle.

# Start ASGI server
CMD ['./runserver.sh']

Na runserver.sh vypadá to,

#!/usr/bin/env bash
# encoding:utf-8
# This is a blocking call
uvicorn gateway:app --host=0.0.0.0 --workers 20 # Default port 8000

Toto je příkaz, který používám pro spuštění kontejneru

docker run --detach --publish 8000:8000 tensor_image

Moje očekávání a cíle: Kontejner bude zůstat naživu, dokud zabil s docker stop příkaz a klient může poslat požadavek na uvicorn server.

To, co se děje: Docker spustit příkaz jen ozvěny dlouhou id kontejneru na terminál a pak kontejner zemře.

Jak udržet v chodu? Také, jak se k zobrazení protokolu serveru sám, pokud jsem se uvicorn log, jeho obsah do místní soubor dovnitř kontejneru?

Pomocí Linux mint uľjana jako můj operační systém, pokud to je důležité. Některé další clari

containers devops docker uvicorn
2021-11-18 10:35:16
2

Nejlepší odpověď

1

Váš problém má co do činění s tím, jak docker běží vaše kontejnery.

Hlavní proces kontejneru bude probíhat závisí na kombinaci dvou Dockerfile návod, ENTRYPOINT a CMD.

V kostce - prosím, zvažte recenze například tento související TAKŽE otázka pro hlubší vhled - ENTRYPOINT definuje příkaz, který bude spuštěn, když váš kontejner začíná. Výchozí ENTRYPOINT příkaz je /bin/sh -c a to nemůže být přepsána docker příkazového řádku.

Na druhou stranu, CMD mohl být za doplnění, argumenty, které budou připojeny k dispozici ENTRYPOINT. To bude přepsán v případě, že byste poskytnout nějaké argumenty při spuštění kontejneru.

V této souvislosti je, myslím, že byste mohli spustit aplikaci v několika způsoby.

Například, tím, že vaše Dockerfile ENTRYPOINT aktuální shell skriptu, který chcete spustit:

ENTRYPOINT ["./runserver.sh"]

Další, pomocí CMD ale úpravou runserver.sh skript a spustit uvicorn s exec:

#!/usr/bin/env bash
# encoding:utf-8
# To run in production with multiple slaves
exec uvicorn gateway:app --host=0.0.0.0 --workers 20 # Default port 8000

exec spustí se proces běžící skript, který má být nahrazen příkaz dal, namísto spuštění je jako nový proces, což je výchozí chování při spuštění příkazu shell.

Můžete použít CMD a poskytnout uvicorn příkaz přímo, stejně - to by mělo být viditelné pro vaše PATH proměnné:

CMD ["uvicorn", "gateway:app", "--host", "0.0.0.0", "--workers", "20"]

Provádění některý z těchto změn bude zajistit, že kontejner není ukončen předčasně.

2021-11-19 22:21:07

Díky za odpověď, a budu se snažit. Přiznávám, že můj koncepční nedostatky, pokud jde o kontejner životního cyklu, a to zejména důvod, proč kontejner zastaví, když runserver.sh je blokování scénář (protože jeho poslední a jediný příkaz). Také, co myslíš tím, že hlavní proces kontejneru? Je to proces s pid=0, tj. systemd?
Della

Omlouvám se za pozdní odpověď @Della. Jste vítáni. Podařilo se vám to zkusit? Ne, prosím, nenechte se zmást s pid, systemd, a tak dále. Omlouvám se, jestli jsem se nevyjádřil moc dobře. Aktualizoval jsem odpověď snažím vysvětlit, co jsem chtěl říct a snaží se poskytuje další možnost. Prosím, mohl by jste to zkontrolovat? Doufám, že to pomůže.
jccampanero

Díky. Ve skutečnosti, což je exec nepomohlo, problém byl jeden citát jako další komentář k původní otázce řekl. V pythonu jsem sotva všimnete, zda řetězec literál je jeden nebo dvakrát citoval, tak nosím přes špatný zvyk do jiných jazyků stejně. Musíme být opatrní.
Della

Děkuji moc za zpětnou vazbu @Della. Jsem rád, že problém byl vyřešen. Omlouvám se, viděl jsem komentář, ale myslím, že to bylo něco, co souvisí s tím, jak jste napsal, otázku, a ne skutečný kód. V žádném případě, doufám, že odpověď poskytuje některé užitečné rady týkající se použití docker.
jccampanero
0

Za účelem odpojení kontejneru, budete muset spustit pro CMD prohlášení v blokujícím režimu.

Ve vašem případě, který jsem se nemohou reprodukovat, měli byste spustit uvicorn ne jako daemon, ale jako blokování aplikace.

2021-11-18 11:00:41

Uvicorn je blokování aplikace, tj. když jsem spustit z terminálu příkazem jsem sdílel, požáry pracovníků, spustí naslouchání na portu 8000 a bloky terminálu čeká na požadavky. Žádný důvod, proč by neměl být blokování uvnitř kontejneru, aby kontejner naživu?
Della

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................