Obrázek kontejneru, který používáte, s největší pravděpodobností nezpracovává správně signály procesu. Pokud obrázek vytváříte, změňte jej podle odpovědi Rolanda Weberse. V opačném případě jej zkuste spustit s --init
.
docker run -it --init ....
Toto opravuje Ctrl+C. Zdroj:https://docs.docker.com/v17.09/engine/reference/run/#specify-an-init-process
Tento příspěvek navrhuje CTRL-Z jako řešení pro odeslání procesu na pozadí a následné ukončení procesu pomocí jeho id procesu:Nelze zabít skript Python pomocí Ctrl-C
Možné problémy:
-
Program zachytí ctrl-c a nedělá nic, což je velmi nepravděpodobné.
-
Existují procesy na pozadí, které nejsou spravovány správně. Signál přijímá pouze hlavní proces a dílčí procesy se zablokují. Velmi pravděpodobné, co se děje.
Navrhované řešení:
-
Podívejte se do dokumentace k programu, jak se správně spouští a zastavuje. Zdá se, že ctrl-c není správný způsob.
-
Zabalte program do bash skriptu docker-entrypoint.sh, který blokuje proces kontejneru a je schopen zachytit ctrl-c. Tento příklad bash by měl pomoci:https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash
-
Po zachycení ctrl-c vyvolejte správnou metodu vypnutí pro notebook ipython.
Problém je v tom, že Ctrl-C odešle signál procesu nejvyšší úrovně uvnitř kontejneru, ale tento proces nemusí nutně reagovat tak, jak byste očekávali. Proces nejvyšší úrovně má uvnitř kontejneru ID 1, což znamená, že nezíská výchozí obslužné rutiny signálů, které procesy obvykle mají. Pokud je procesem nejvyšší úrovně shell, pak může signál přijímat prostřednictvím svého vlastního handleru, ale nepředává jej příkazu, který se provádí v rámci shellu. Podrobnosti jsou vysvětleny zde. V obou případech se ukotvitelný kontejner chová, jako by jednoduše ignoroval Ctrl-C.
Pokud vytváříte své vlastní obrázky, řešením je spustit minimální proces init, jako je tini nebo dumb-init, jako proces nejvyšší úrovně uvnitř kontejneru.