Mam podobny problem z systemami Linux. Po uruchomieniu systemu kontener z zasadą restartu „chyba, że zatrzymano”, nie uruchomiłby się automatycznie, chyba że wpisałem polecenie używające dockera w jakiś sposób, na przykład „docker ps”. Byłem zaskoczony, ponieważ spodziewałem się, że to polecenie poda tylko informacje o stanie. Następnie wypróbowałem polecenie „systemctl status docker”. W systemie, w którym nie zostały uruchomione żadne polecenia Dockera, polecenie to zgłosiło następujące informacje:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
Active: inactive (dead) TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
W systemie, w którym „docker ps” został uruchomiony bez innych poleceń Dockera, otrzymałem następujące informacje:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
Active: active (running) since Sun 2020-11-22 08:33:23 PST; 1h 25min ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 3135 (dockerd)
Tasks: 13
Memory: 116.9M
CGroup: /system.slice/docker.service
└─3135 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
... [various messages not shown ]
Najbardziej prawdopodobnym wyjaśnieniem jest to, że Docker czeka na jakąś komendę Dockera przed pełną inicjalizacją i uruchomieniem kontenerów. Można przypuszczalnie uruchomić "docker ps" w pliku jednostki systemowej w momencie, gdy wszystkie usługi, których potrzebują twoje kontenery, zostały zainicjowane. Przetestowałem to, umieszczając plik o nazwie docker-onboot.service w katalogu / lib / systemd / system z następującą zawartością:
[Unit]
# This service is provided to force Docker containers
# that should automatically restart to restart when the system
# is booted. While the Docker daemon will start automatically,
# it will not be fully initialized until some Docker command
# is actually run. This unit merely runs "docker ps": any
# Docker command will result in the Docker daemon completing
# its initialization, at which point all containers that can be
# automatically restarted after booting will be restarted.
#
Description=Docker-Container Startup on Boot
Requires=docker.socket
After=docker.socket network-online.target containerd.service
[Service]
Type=oneshot
ExecStart=/usr/bin/docker ps
[Install]
WantedBy = multi-user.target
Do tej pory (jeden test z włączoną tą usługą) kontener uruchamiał się podczas rozruchu komputera. Nie próbowałem zależności od docker.service, ponieważ docker.service nie uruchomi się, dopóki nie zostanie uruchomione polecenie docker. Następny test będzie wykonywany z wyłączonym docker-onboot (aby sprawdzić, czy zależność WantedBy uruchomi ją automatycznie).
Systemd
jako menedżera usług jest jednym z najlepszych rozwiązań do tego celu i wymaga więcej głosów.