diff --git a/Dockerfile b/Dockerfile index c94a4f8..b2e558d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,15 +34,18 @@ RUN chmod 0600 ~/.vnc/passwd EXPOSE 5900 -COPY vnc/xstartup.turbovnc /root/.vnc/ +COPY vnc/xstartup.turbovnc /etc/ COPY vnc/turbovncserver-security.conf /etc/ RUN chmod 0600 /etc/turbovncserver-security.conf COPY vnc/turbovncserver.conf /etc/ COPY app/*.sh /app/ RUN openssl req -x509 -nodes -newkey rsa:2048 -keyout /tmp/novnc.key -out /tmp/novnc.pem -days 3650 -subj "/C=US/ST=NY/L=NY/O=NY/OU=NY/CN=NY emailAddress=email@example.com" +ENV DISPLAY_NUM=99 +ENV DISPLAY=:${DISPLAY_NUM} +RUN touch /root/.Xauthority -CMD ["/app/app.sh"] +ENTRYPOINT ["/app/app.sh"] # https://dunedlin.wordpress.com/2020/10/24/a-minimal-x11-install/ # https://askubuntu.com/questions/1313445/how-do-i-install-vnc-on-a-headless-ubuntu-20-10 diff --git a/app/app.sh b/app/app.sh index 2a053e0..a2391b4 100755 --- a/app/app.sh +++ b/app/app.sh @@ -1,11 +1,17 @@ -#!/bin/bash +#!/usr/bin/env bash +set -x -export DISPLAY=:${DISPLAY_NUM} -RFB_PORT=59${DISPLAY_NUM} -NOVNC_PORT=80${DISPLAY_NUM} +source /app/signals.sh -echo Display at ${DISPLAY} with ${SCREEN_W}x${SCREEN_H}x24 -exec icewm-session -o /var/log/icewm.log & -exec /opt/TurboVNC/bin/Xvnc ${DISPLAY} -geometry ${SCREEN_W}x${SCREEN_H} -depth 24 +xinerama -securitytypes none >/var/log/xvfb.log & -exec socat TCP-LISTEN:60${DISPLAY_NUM},fork,bind=0.0.0.0 UNIX-CONNECT:/tmp/.X11-unix/X${DISPLAY_NUM} & -exec /tmp/websockify/run --web=/tmp/noVNC/ --cert=/tmp/novnc.pem --key=/tmp/novnc.key ${NOVNC_PORT} localhost:${RFB_PORT} +signals_trap_with_arg func_trap TERM + +/app/server.sh & +PID=-1 + +# wait forever +while true +do + tail -f /dev/null & wait ${!} +done + +# https://medium.com/@gchudnov/trapping-signals-in-docker-containers-7a57fdda7d86 \ No newline at end of file diff --git a/app/server.sh b/app/server.sh new file mode 100755 index 0000000..d852e00 --- /dev/null +++ b/app/server.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -x + +RFB_PORT=59${DISPLAY_NUM} +NOVNC_PORT=80${DISPLAY_NUM} + +echo Display at ${DISPLAY} with ${SCREEN_W}x${SCREEN_H}x24 +/opt/TurboVNC/bin/Xvnc ${DISPLAY} -geometry ${SCREEN_W}x${SCREEN_H} -depth 24 +xinerama -securitytypes none >/var/log/xvfb.log & +icewm-session -o /var/log/icewm.log & +/tmp/websockify/run -D --web=/tmp/noVNC/ --cert=/tmp/novnc.pem --key=/tmp/novnc.key ${NOVNC_PORT} localhost:${RFB_PORT} +socat TCP-LISTEN:60${DISPLAY_NUM},fork,bind=0.0.0.0 UNIX-CONNECT:/tmp/.X11-unix/X${DISPLAY_NUM} + diff --git a/app/signals.sh b/app/signals.sh new file mode 100644 index 0000000..0e01957 --- /dev/null +++ b/app/signals.sh @@ -0,0 +1,21 @@ +PID=0 + +signals_trap_with_arg() { + func="$1" ; shift + for sig ; do + echo "$func $sig" + trap "$func $sig" "$sig" + done +} + +func_trap() { + echo "Trapped: $1" + echo "Killing ${PID}" + if [ ${PID} -ne 0 ]; then + kill -SIGTERM "${PID}" + wait "${PID}" + fi + ps -ef --forest + + exit 143 +} diff --git a/run.sh b/run.sh index c0b883c..a4d6c29 100755 --- a/run.sh +++ b/run.sh @@ -1,4 +1,4 @@ #/bin/bash DISPLAY_NUM=99 -docker run --rm --net bridge -p 5910:59${DISPLAY_NUM}/tcp -e DISPLAY_NUM=${DISPLAY_NUM} -e SCREEN_W=1536 -e SCREEN_H=960 -it $1 +docker run --rm --net bridge -p 5910:59${DISPLAY_NUM}/tcp -e DISPLAY_NUM=${DISPLAY_NUM} -e SCREEN_W=1536 -e SCREEN_H=960 -it $1 bash --login diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..7d14d8a --- /dev/null +++ b/start.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +trap_with_arg() { + func="$1" ; shift + for sig ; do + echo "$func $sig" + trap "$func $sig" "$sig" + done +} + +func_trap() { + echo "Trapped: $1" + echo "Killing ${PID}" + kill -9 -${PID} +} + +trap_with_arg func_trap EXIT TERM HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM +./parent.sh & +PID=$$ +echo "Pid = $PID" + +sleep 10 diff --git a/vnc/xstartup.turbovnc b/vnc/xstartup.turbovnc index 00b1f33..f9acbc6 100755 --- a/vnc/xstartup.turbovnc +++ b/vnc/xstartup.turbovnc @@ -3,9 +3,10 @@ unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS XDG_SESSION_TYPE=x11; export XDG_SESSION_TYPE +/usr/bin/icewm-session& # Do NOT use 3D unity on Ubuntu 16.10 export TVNC_WM=2d # Start the window manager under VGL so that we always get acceleration -export TVNC_VGL=1 +export TVNC_VGL=0