Ich möchte beim Systemstart lediglich ein Skript ausführen und nach vielen Versuchen und dem Befolgen mehrerer Tutorials und Dokumentationen gelingt mir dies nicht.
Können Sie erkennen, was ich falsch mache?
Führen Sie Ubuntu 20.04 im Docker aus:
docker run -d --name daemon ubuntu:20.04 tail -f /dev/null
Stellen Sie eine Verbindung dazu her:
docker exec -it daemon /bin/bash
Schreiben /etc/init.d/test
:
#!/bin/bash
### BEGIN INIT INFO
# Provides: Join the Swarm
# Default-Start: 4
# Default-Stop: 0 6
# Description: Join the Swarm
### END INIT INFO
start(){
/usr/bin/echo start >> /var/log/test.log
}
stop(){
/usr/bin/echo stop >> /var/log/test.log
}
case "$1" in
start)
start;;
stop)
stop;;
status)
cat /var/log/test.log;;
restart)
stop;
start;
;;
*);;
esac
exit 0;
Legen Sie Berechtigungen fest und aktivieren Sie den Dienst:
chmod 755 /etc/init.d/test
update-rc.d test defaults 91
update-rc.d test enable
Überprüfen Sie, ob es tatsächlich funktioniert:
service test restart
service test status
Die Ausgabe sollte folgendes sein:
stop
start
Entfernen Sie die Protokolldatei und beenden Sie die Sitzung:
rm -rf /var/log/test.log
exit
Starten Sie den Container neu und stellen Sie erneut eine Verbindung her:
docker restart daemon
docker exec -it daemon /bin/bash
Überprüfen Sie, ob der Dienst tatsächlich aktiv ist:
service --status-all
Leider wurde es nie ausgeführt:
root@407a8e2c90ee:/# service test status
cat: /var/log/test.log: No such file or directory
Es scheint, mit den RCs ist alles in Ordnung:
root@407a8e2c90ee:/# ls /etc/rc*.d
/etc/rc0.d:
K01test
/etc/rc1.d:
/etc/rc2.d:
/etc/rc3.d:
/etc/rc4.d:
S01test
/etc/rc5.d:
/etc/rc6.d:
K01test
/etc/rcS.d:
S01procps
Antwort1
was ich aus Ihrer Frage verstanden habe: Sie möchten einen Ubuntu:20.04-Container starten und innerhalb dieses Containers soll ein zusätzlicher Dienst gestartet werden.
- es ist toll, dich in der Container-Unterstützer-Familie zu haben.
- Das von Ihnen beschriebene Problem hat nichts mit Ubuntu zu tun, es ist das Standardverhalten von Containern.
- Beim Starten eines Containers wird in Ihrem Fall ein einzelnes Skript ausgeführt
tail -f /dev/null
– sonst nichts. Ein Ubuntu-Container ist keine vollständige Ubuntu-VM! - Der reguläre Ubuntu-Bootvorgang findet nicht in einem Container statt. Ihr Service wird nie berührt. So gehen Sie vor:
- statt dessen
docker run ...
empfehle ich das Auscheckendocker-compose
und die Syntax derdocker-compose.yaml
Datei - Überprüfen Sie den Parameter
command
oderentrypoint