Bash Wie Trap programmieren?

CyborgBeta

Commander
Registriert
Jan. 2021
Beiträge
2.895
Hi,

ich muss tigervncserver -kill :* ausführen, wenn ein Docker-Container gestoppt wird, und brauche dafür eine Trap (also eine Art Shutdown-Hook), die auf SIGINT oder SIGHUP reagiert lauscht.

Wie programmiert man die Trap richtig?

Bisher habe ich Folgendes:

novnc-debian/Dockerfile:

Code:
FROM debian:12

ENV TZ=Europe/Berlin

EXPOSE 6901

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt update
RUN apt upgrade -y
RUN apt install nano net-tools git -y
RUN apt install lxde -y
RUN apt install tigervnc-standalone-server -y
RUN apt install dbus-x11 -y
RUN adduser --disabled-password --gecos "" headless
RUN echo "root:no"|chpasswd

RUN apt install firefox-esr -y
RUN apt clean

CMD [ "sh", "-c", "cd /home/headless/ && (git -C noVNC pull || git clone https://github.com/novnc/noVNC.git noVNC) && tigervncserver -localhost yes -SecurityTypes None -geometry 1600x900 && cd noVNC/ && (nohup ./utils/novnc_proxy --vnc localhost:5901 --listen 6901 &) && trap '{ tigervncserver -kill :*; }' 1 && while : ; do sleep 1 ; done" ]

docker-compose.yml:

Code:
  novnc-debian:
    build: ./novnc-debian/Dockerfile
    init: true
    stop_signal: SIGHUP
    user: 1000:1000
    ports:
      - 6901:6901
    volumes:
      - ./novnc-debian/headless/:/home/headless/

Hinweis, vorsichtshalber bitte nicht ohne NAT testen, da 6901 exposed wird und kein Passwort verwendet wird ...

Ist

&& trap '{ tigervncserver -kill :*; }' 1 && while : ; do sleep 1 ; done

richtig?

Danke für Antworten.

Edit: Ich knüpfe damit an dieses Thema an https://www.computerbase.de/forum/threads/wie-erlange-ich-hier-root-debian.2211540/
 
Also ich weiß nicht genau, was du erreichen willst, aber für mich sieht es aus, als würdest du gerne mehrere Commands gleichzeitig im Container laufen lassen. Dafür empfehle ich dir mal Container init Systeme wie tini oder s6 anzuschauen. Das init System kümmert sich dann beim stoppen des Containers um alle Hintergrundprozesse.

Außerdem ist es glaube ich sinnvoll die git Befehle schon im Image Build zu machen und nicht erst bei Container start.
Und wenn du eh unter /home/headless arbeitest, kannst du auch das WORKDIR auf /home/headless setzen.
Für root empfehle ich kein PW für root zu setzen, sondern sudo und ein sudoers file für headless.
 
  • Gefällt mir
Reaktionen: CyborgBeta
@DorMoordor Danke schön. Alles wichtige Punkte, die du erwähnt hast. (Ich dachte schon, es findet sich kein Antwortender mehr ...)

DorMoordor schrieb:
aber für mich sieht es aus, als würdest du gerne mehrere Commands gleichzeitig im Container laufen lassen.
Ja, möchte ich. Im Prinzip soll ein ganzer Linux-Container + Desktop + VNC gebaut werden, und aktualisierbar und neu-startbar sein.

DorMoordor schrieb:
Dafür empfehle ich dir mal Container init Systeme wie tini oder s6 anzuschauen.
👍 Funktioniert das zusammen mit docker compose?

DorMoordor schrieb:
Das init System kümmert sich dann beim stoppen des Containers um alle Hintergrundprozesse.
👍

DorMoordor schrieb:
Außerdem ist es glaube ich sinnvoll die git Befehle schon im Image Build zu machen und nicht erst bei Container start.
Stimmt, diese müssen nicht bei jedem Container-Start sein. 👍

DorMoordor schrieb:
Und wenn du eh unter /home/headless arbeitest, kannst du auch das WORKDIR auf /home/headless setzen.
Danke, das wusste ich noch nicht, bzw. hatte ich nicht mehr auf dem Schirm. 👍

DorMoordor schrieb:
Für root empfehle ich kein PW für root zu setzen, sondern sudo und ein sudoers file für headless.
👍
 
So, hab es nun korrekt hinbekommen:

Bash:
FROM debian:12

ENV TZ=Europe/Berlin

EXPOSE 6901

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt update
RUN apt upgrade -y
RUN apt install nano net-tools git -y
RUN apt install xfce4 xfce4-goodies -y
RUN apt install tigervnc-standalone-server dbus-x11 -y
RUN adduser --disabled-password --gecos "" headless
RUN echo "root:no"|chpasswd

RUN apt install firefox-esr <weitere Programme hier> -y
RUN apt clean

USER headless
WORKDIR /home/headless
RUN git -C noVNC pull || git clone https://github.com/novnc/noVNC.git noVNC

CMD [ "sh", "-c", "tigervncserver -localhost yes -SecurityTypes None -geometry 1600x900 && cd noVNC/ && (nohup ./utils/novnc_proxy --vnc localhost:5901 --listen 6901 &) && trap 'tigervncserver -kill :* ; exit' INT && while : ; do sleep 1 ; done" ]

Die Trap muss auf INT lauschen und nach dem Triggern exit aufrufen, damit die sleep-Schleife auch graceful beendet wird, und nicht nach 10 Sekunden abgewürgt wird.

Ich bin dabei geblieben, su zuzulassen.

Bash:
services:
  novnc-debian:
    build: ./novnc-debian/Dockerfile
    init: true
    stop_signal: SIGINT
    user: 1000:1000
    ports:
      - 6901:6901
    volumes:
      - ./novnc-debian/headless/:/home/headless/

init ist möglicherweise unnötig ... hab es noch drin gelassen.

Aufruf mit http://localhost:6901/vnc_lite.html. Der Restart dauert jetzt nur noch 1 Sekunde. ;)
 
Hier ist mal docker compose restart novnc-debian in Aktion:

1728214311438.gif
 
Zurück
Oben