Ich habe einen Container mit odoo auf dem Verzeichnis "/ opt / odoo /".
Ein Init-Skript auf "/etc/init.d/odoo-server"
%Vor%dann tue ich
%Vor%Wenn ich das Andockfenster mit docker starten starte, startet der odoo-server nicht, wenn ich im Andockfenster /etc/init.d/odoo-server starte starte es ok ...
Was passiert?
Docker-Container haben normalerweise kein funktionierendes Init-System. Wenn Sie nur einen einzigen Dienst ausführen, fangen Sie einfach damit an.
Wenn Sie etwas Komplexeres benötigen, schauen Sie sich supervisord oder runit .
Container sind keine virtuellen Maschinen.
Wenn Sie nach einem Docker-Image suchen, das sich wie eine vollständige VM mit init-System verhält, werfen Sie einen Blick auf phusion basiceimage
Jetzt habe ich den Fehler in einigen Stunden der Arbeit aufgespürt.
Der Grund für das Problem, dass start-stop-daemon
, der Hauptdämon-Starter / Tester / Stopper-Tool des Debian-Systems, die Existenz eines Daemon durch Prüfung der virtuellen Soft-Link des Daemon-Prozesses in /proc/<pid>/exe
(es sollte zeigen Sie auf das Binärbild des gestarteten Prozesses).
Das Problem ist nun, dass diese weiche Verknüpfung im Andockfenster standardmäßig nicht funktioniert. Dies liegt daran, dass Docker bei der Standardinstallation strenge Sicherheitsrichtlinien verwenden muss (es wird hauptsächlich zum Ausführen nicht identifizierter Software verwendet).
Es gibt viele Problemumgehungen für die Aufgabe, einige müssen die Berechtigungseinstellungen eines Containers ändern, andere nicht. Zwei Beispiele:
start-stop-daemon
nicht mit den Flags --test
und --exec
--cap-add=SYS_ADMIN
die Option docker run
geben (keine Sorge, Ihrem Docker-Container werden keine Sysadm-Berechtigungen zugewiesen, es ist wahrscheinlich nur eine Vorsichtsmaßnahme für die produktive Nutzung) Neben diesen funktioniert auch systemd
nicht im Andockfenster, obwohl es wahrscheinlich eher ein Nachteil von Systemd ist als vom Andockfenster. Anstelle von systemd
ist Neustart verwendbar.
PS .: Docker-Entwickler / Befürworter sagen oft, "Container sind keine VMs" und ähnliches. Aber in der alltäglichen Erfahrung gibt es keinen wirklich starken Unterschied zwischen den beiden, und für eine produktive Docker-Verwendung der Software wäre zumindest eine minimale Unterstützung einer VPS-ähnlichen Funktion sicherlich nützlich. Hoffentlich wird sich auch die Docker-Entwicklung in naher Zukunft auf diese Richtung konzentrieren.
Ich habe festgestellt, dass der Dienst nicht gestartet wird, weil /usr/sbin/policy-rc.d
einen 101-Code zurückgibt:
Siehe: Ссылка
And docker setzen es 101 in einem Container zurückgeben.
Also, ändern Sie das Skript auf Build funktioniert, können Sie eine build.sh
in Dockerfile
ausführen und führt das folgende Skript: