HOWTO Docker
Docker is a platform that lets you package, ship, and run applications in lightweight, portable units called containers.
Docker makes it easy to run an application the same way everywhere—on your laptop, a server, or in the cloud—without worrying about differences in operating systems or installed software.
IGEL Managed Containers™
-
Secure, governed containerized workloads for the distributed edge.
-
IGEL Managed Containers™ extends the IGEL Adaptive Secure Endpoint Platform™ with a managed container workload model for delivering controlled, policy-aligned applications and services.
-
Run containerized workloads on the immutable IGEL OS™ foundation, connect to existing OCI-compliant registries, and centrally govern deployment and lifecycle operations through the IGEL Universal Management Suite. IGEL Managed Containers helps organizations bring modern application flexibility to IT and OT environments while preserving endpoint trust, operational control, and enterprise policy alignment.
-
IGEL Web Site: IGEL Managed Containers™
-
IGEL KB: IGEL Managed Containers™
Install Docker on IGEL OS
NOTE: Need to run docker as root.
Test Docker with hello-world
What happens internally:
- Docker checks if the hello-world image exists locally
- If not, it pulls it from Docker Hub
- Docker creates and runs a container
- The container prints a message and exits
Docker Examples
- Setup Debian Bookworm (12)
| docker run --network host -it debian:bookworm bash -c \
"apt-get update && apt-get install -y curl iputils-ping && bash"
|
| docker run --network host -it ubuntu:22.04 bash -c \
"apt-get update && apt-get install -y curl iputils-ping && bash"
|
| docker run --network host -it debian:bookworm
|
| docker run --network host -it ubuntu:22.04
|
Use Docker to collect latest deb files
Summary of steps:
- Create
dockerfile
- Create
get-debs.sh to collect deb files
- Create
run-docker.sh to run docker to collect the files and save into artifacts folder
Save the following as dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | cat << "EOF" > dockerfile
# Choose a base image
FROM debian:bookworm AS build
# Set a working directory inside the image
WORKDIR /tmp
COPY . .
# Copy deb collection script
COPY get-debs.sh .
# Install dependencies
RUN apt update && apt-get install -y curl gnupg | tee -a debug.txt
# run get-debs to collect the deb files
RUN bash ./get-debs.sh | tee -a debug.txt
# copy deb files to out folder
RUN mkdir -p /out
RUN cp -v *.deb /out/
RUN cp -v deb-listing.txt /out/
RUN cp -v debug.txt /out/
# copy files out of container
FROM scratch AS export
COPY --from=build /out/ /
EOF
|
Save the following as get-debs.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | echo << "EOF" > get-debs.sh
#!/bin/bash
#set -x
#trap read debug
MISSING_LIBS="containerd.io docker-buildx-plugin docker-ce docker-ce-cli docker-ce-rootless-extras docker-compose-plugin"
apt install curl -y
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian \
bookworm stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
mkdir build_tar
cd build_tar
for lib in $MISSING_LIBS; do
apt-get download $lib
ls $lib* >> deb-listing.txt
mv $lib*.deb $lib.deb
done
mv *.deb ..
mv deb-listing.txt ..
cd ..
rm -rf build_tar
EOF
|
Save the following as run-docker.sh:
| cat << "EOF" > run-docker.sh
#!/bin/bash
mkdir -p artifacts
docker system prune -f
docker buildx build --network host --target export --output type=local,dest=./artifacts .
EOF
chmod a+x run-docker.sh
|
- The deb files will be in the
artifacts folder
Run Chrome in Docker
Summary of steps:
- Create
dockerfile
- Follow notes in
run-docker.sh to setup X11 items
- Run
run-docker.sh to build the image, install latest Chrome, and run Chrome
Save the following as dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | cat << "EOF" > dockerfile
# Debian 12 (bookworm)
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl \
gnupg \
&& mkdir -p /etc/apt/keyrings \
&& curl -fsSL https://dl-ssl.google.com/linux/linux_signing_key.pub \
| gpg --dearmor -o /etc/apt/keyrings/google-linux.gpg
RUN echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/google-linux.gpg] \
http://dl.google.com/linux/chrome/deb/ stable main" \
> /etc/apt/sources.list.d/google-chrome.list
RUN apt-get update && apt-get install -y google-chrome-stable
# Create group and user
RUN groupadd -r appuser && useradd -r -g appuser -m appuser
# Switch to the new user
USER appuser
# Run Chrome
ENTRYPOINT ["google-chrome-stable"]
EOF
|
Save the following as run-docker.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | cat << "EOF" > run-docker.sh
#!/bin/bash
#
# For X11
# As user obtain xauth -f ~/.Xauthority list|tail -1
# As root xauth add string-from-above-command
# As root xhost +local:docker
#
#
IMAGE="chrome:bookworm"
docker system prune -f
if docker image inspect "$IMAGE" >/dev/null 2>&1; then
echo "Image $IMAGE exists."
else
echo "Image $IMAGE does not exist."
docker build --network host -t $IMAGE .
fi
docker run --network host --rm -it \
--security-opt seccomp=unconfined \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e PULSE_SERVER=unix:/run/user/777/pulse/native \
-e PULSE_COOKIE=/root/.config/pulse/cookie \
-v /run/user/777/pulse:/run/user/777/pulse \
-v /userhome/config/pulse/cookie:/root/.config/pulse/cookie:ro \
--device=/dev/dri \
--group-add video \
--group-add audio \
--shm-size=2g \
chrome:bookworm
EOF
chmod a+x run-docker.sh
|
Using IGEL OS App SDK Docker image
Summary of steps:
- Download IGEL OS App SDK Docker image from IGEL App Creator Portal
- Load the docker image
- Create
dockerfile
- Zip up the recipe and any needed files into
recipe.zip
- Create
run-docker.sh to run docker to build the image, collect the certificates, create zip file of results, and save into artifacts folder
Load the docker image
docker load < igelpkg.tar
Create recipe.zip
Save the following as dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 | cat << "EOF" > dockerfile
# Choose a base image
FROM igelpkg:latest AS build
# Set a working directory inside the image
WORKDIR /tmp
COPY . .
# Copy zip of recipe and any needed files
RUN rm -rf /tmp/*
COPY recipe.zip .
# Install dependencies
RUN apt update && apt-get install -y zip
# unzip recipe
RUN unzip recipe.zip
RUN rm recipe.zip
# run igel packager
RUN igelpkg build -r bookworm -a x64 -sp -sa -l -sr
# copy certs
RUN cp /usr/share/igelpkg/certs/IGEL_OS_12_SDK-intermediate.crt .
RUN cp /usr/share/igelpkg/certs/IGEL_OS_12_SDK-leaf.crt .
# create zip file and copy to out folder
RUN mkdir -p /out
RUN zip -r build_results.zip *
RUN cp -v build_results.zip /out/
# copy files out of container
FROM scratch AS export
COPY --from=build /out/ /
EOF
|
Save the following as run-docker.sh:
| cat << "EOF" > run-docker.sh
#!/bin/bash
mkdir -p artifacts
docker system prune -f
docker buildx build --network host --target export --output type=local,dest=./artifacts .
EOF
chmod a+x run-docker.sh
|
- The zip,
build_results.zip, file will be in the artifacts folder
Run Mono based app in Docker
Summary of steps:
- Create
dockerfile
- Create
publish folder and copy the mono application and its files into publish
- Follow notes in
run-docker.sh to setup X11 items
- Run
run-docker.sh to build the image, install mono, and run mono application
Save the following as dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | cat << "EOF" > dockerfile
# Debian 12 (bookworm)
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
# Install prerequisites + Mono repo + mono runtime
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates gnupg dirmngr wget \
&& rm -rf /var/lib/apt/lists/*
# Add Mono Project repository key + repo (signed-by style)
#RUN mkdir -p /etc/apt/keyrings \
# && wget -qO /etc/apt/keyrings/mono-official-archive-keyring.gpg \
# https://download.mono-project.com/repo/xamarin.gpg \
# && echo "deb [signed-by=/etc/apt/keyrings/mono-official-archive-keyring.gpg] \
# https://download.mono-project.com/repo/debian stable-bookworm main" \
# > /etc/apt/sources.list.d/mono-official-stable.list
# Install Mono runtime (or replace with mono-complete if you need everything)
RUN apt-get update && apt-get install -y --no-install-recommends \
mono-complete libgdiplus \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy a prebuilt app (e.g., MyApp.exe) into the image
COPY ./publish/ ./
# Run your app
# If your entrypoint is a single exe, this works well:
ENTRYPOINT ["mono", "MyApp.exe"]
EOF
|
Save the following as run-docker.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | cat << "EOF" > run-docker.sh
#!/bin/bash
#
# For X11
# As user obtain xauth -f ~/.Xauthority list|tail -1
# As root xauth add string-from-above-command
# As root xhost +local:docker
#
IMAGE="my-mono-app:bookworm"
docker system prune -f
if docker image inspect "$IMAGE" >/dev/null 2>&1; then
echo "Image $IMAGE exists."
else
echo "Image $IMAGE does not exist."
docker build --network host -t $IMAGE .
fi
docker run --network host --rm -it \
--security-opt seccomp=unconfined \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
my-mono-app:bookworm
EOF
chmod a+x run-docker.sh
|
Run WINE in Docker
Wine (originally an acronym for "Wine Is Not an Emulator") is a compatibility layer capable of running Windows applications. Instead of simulating internal Windows logic like a virtual machine or emulator, Wine translates Windows API calls into POSIX calls on-the-fly, eliminating the performance and memory penalties of other methods and allowing you to cleanly integrate Windows applications into your desktop.
Summary of steps:
- Create
dockerfile
- Create
work folder and copy the Windows application into work
- Follow notes in
run-docker.sh to setup X11 items
- Run
run-docker.sh to build the image, install WINE, and run Windows application (notepad)
Save the following as dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 | cat << "EOF" > dockerfile
FROM debian:bookworm
#
# https://www.winehq.org/`
#
ENV DEBIAN_FRONTEND=noninteractive
RUN dpkg --add-architecture i386
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl wget \
gnupg \
&& mkdir -p /etc/app/sources.list.d \
&& mkdir -pm755 /etc/apt/keyrings \
&& wget -O - https://dl.winehq.org/wine-builds/winehq.key \
| gpg --dearmor -o /etc/apt/keyrings/winehq-archive.key - \
&& wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/debian/dists/bookworm/winehq-bookworm.sources
# Install Wine (wine64 + wine32), plus a few useful helpers
RUN apt-get update && apt-get install --install-recommends -y winehq-stable libvulkan1 \
winbind \
xvfb \
cabextract \
fonts-wine
# Create a non-root user (recommended; Wine + root is often messy)
RUN useradd -u 777 -m -s /bin/bash wineuser
USER wineuser
WORKDIR /home/wineuser
CMD ["bash"]
EOF
|
Save the following as run-docker.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 | cat << "EOF" > run-docker.sh
#!/bin/bash
#set -x
#trap read debug
#
# For X11
# As user obtain xauth -f ~/.Xauthority list|tail -1
# As root xauth add string-from-above-command
# As root xhost +local:docker
#
IMAGE="wine:debian"
mkdir -p work
docker system prune -f
if docker image inspect "$IMAGE" >/dev/null 2>&1; then
echo "Image $IMAGE exists."
else
echo "Image $IMAGE does not exist."
docker build --network host -t $IMAGE .
fi
docker run --network host --rm -it \
--security-opt seccomp=unconfined \
--device=/dev/dri \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v $PWD:/work -w /work \
wine:debian bash
EOF
chmod a+x run-docker.sh
|
Use Docker to assist with building SAP GUI
SAP GUI for Linux is installed from a custom package. Docker can be used to extract the files and create tar.bz2 file that can be used with the IGEL App Creator Portal.
IGEL Community GitHub: SAP GUI
Summary of steps:
- Obtain SAPGUI installer
PlatinGUI-Linux-x86_64-Installation
- Create
dockerfile
- Create
build-sapgui-tar.sh
- Create and run
run-docker.sh to create the sapgui.tar.bz2 file
Save the following as dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | cat << "EOF" > dockerfile
FROM debian:12-slim
RUN apt-get update && apt-get install -y \
bzip2 \
tar \
findutils \
coreutils \
xz-utils \
libxtst6 \
libxi6 \
libxrender1 \
libxext6 \
libx11-6 \
libxpm4 \
unzip \
xdg-utils \
&& rm -rf /var/lib/apt/lists/*
COPY PlatinGUI-Linux-x86_64-Installation /tmp/
COPY build-sapgui-tar.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/build-sapgui-tar.sh
CMD ["/usr/local/bin/build-sapgui-tar.sh"]
EOF
|
Save the following as build-sapgui-tar.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | cat << "EOF" > build-sapgui-tar.sh
#!/bin/bash
set -euxo pipefail
GETVERSION_FILE="PlatinGUI-Linux-x86_64-Installation"
pushd /
find etc opt usr | sort > /tmp/find_root_listing1.txt
popd
chmod a+x "/tmp/${GETVERSION_FILE}"
"/tmp/${GETVERSION_FILE}" install -f -s
pushd /
find etc opt usr | sort > /tmp/find_root_listing2.txt
comm -1 -3 /tmp/find_root_listing1.txt /tmp/find_root_listing2.txt \
| tar -cjvf /tmp/sapgui.tar.bz2 -T -
popd
cp /tmp/sapgui.tar.bz2 /output/sapgui.tar.bz2
cp /root/sapgui.log /output/sapgui.log
EOF
|
Save the following as run-docker.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13 | cat << "EOF" > run-docker.sh
#!/bin/bash
mkdir -p output
docker system prune -f
docker build --network host -t sapgui-builder .
docker run --network host --rm \
-v "$PWD/output:/output" \
sapgui-builder
EOF
chmod a+x run-docker.sh
|
Use Docker to modify an OSC ISO image (12.9.0+) with IGEL Apps and optional additional content
With IGEL OS 12.9.0+ the OSC ISO package has modify_osc_image script that can be run on Ubuntu / Debian system to create an ISO installer image that can include applications and other settings.
NOTE: Popsicle can be used to flash multiple USB devices in parallel.
Docker can be used on IGEL OS to run the modify_osc_image.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | Script to modify an OSC ISO image with igel-apps and optional additional content (version 0.9igel1778165738)
Usage: ./modify_osc_image --iso <iso_file> --apps-path <apps_directory> [OPTIONS]
Mandatory parameters:
--iso <file> Path to the input ISO file
--apps-path <directory> Path containing the .ipkg apps to add to the ISO
Optional parameters:
--cert-path <directory> Path containing certificates
--lic-path <directory> Path containing licenses
--settings <file> Path to the pre-configured settings file setup.ini
--ci-path <directory> Path containing corporate identity files like wallpapers
--cmty-certs-path <directory> Path containing community apps certificates
--cmty-im-certs-path <directory> Path containing community apps intermediate certificates
--after-install <action> Action after installation: 'reboot' or 'shutdown'
--unattended-mode Enable unattended mode (flag, no value needed)
-v, --version Display the version of this script
-h, --help Display this help message
Examples:
./modify_osc_image --iso /path/to/igelos.iso --apps-path /path/to/apps
./modify_osc_image --iso /path/to/igelos.iso --apps-path /path/to/apps --cert-path /path/to/certs --settings /path/to/setup.ini
./modify_osc_image --iso /path/to/igelos.iso --apps-path /path/to/apps --after-install reboot
Output:
Creates a new ISO file with timestamp: <original_name>_<timestamp>.iso
|
Summary of steps:
- Create
dockerfile
- Create
docker-igel-iso-os12.sh
- Create
run-docker.sh
- Create
modify_osc_image.patch
- Create
packages folder and copy the application packages downloaded from app.igel.com into packages folder
- Copy the
osc iso image and modify_osc_image from osc preparestick folder
- Run
run-docker.sh to create artifacts folder with the new iso image
Save the following as dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | cat << "EOF" > dockerfile
# Choose a base image
FROM debian:bookworm AS build
# Set a working directory inside the image
WORKDIR /tmp
COPY . .
# Copy in the files
COPY docker-igel-iso-os12.sh .
COPY osc*.iso .
COPY packages .
COPY modify_osc_image* .
# Install dependencies
RUN apt update && apt-get install jq xorriso unzip patch -y | tee -a debug.txt
# run iso builder
RUN bash ./docker-igel-iso-os12.sh | tee -a debug.txt
# copy files to out folder
RUN mkdir -p /out
#RUN cp -vR * /out/
#RUN cp *.iso /out/
RUN cp osc-*_*_*.iso /out/
RUN cp debug.txt /out/
# copy files out of container
FROM scratch AS export
COPY --from=build /out/ /
EOF
|
Save the following as docker-igel-iso-os12.sh
| cat << "EOF" > docker-igel-iso-os12.sh
#!/bin/bash
#set -x
#trap read debug
# Called by run-docker.sh
patch modify_osc_image < modify_osc_image.patch
./modify_osc_image --iso osc-*.iso --unattended-mode --after-install reboot --apps-path packages
EOF
|
Save the following as run-docker.sh
| cat << "EOF" > run-docker.sh
#!/bin/bash
rm -rf artifacts
mkdir -p artifacts
docker system prune -f
#docker buildx build --progress=plain --network host --target export --output type=local,dest=./artifacts .
docker buildx build --network host --target export --output type=local,dest=./artifacts .
docker system prune -f
EOF
chmod a+x run-docker.sh
|
Save the following as modify_osc_image.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | cat << "EOF" > modify_osc_image.patch
--- orig_modify_osc_image 2026-06-09 12:37:01.060864258 -0600
+++ modify_osc_image 2026-06-09 14:49:52.536870823 -0600
@@ -714,7 +714,7 @@
echo "Please review all End User License Agreements."
echo ""
echo -n "Press any key to open in your default text viewer..."
- read -n 1 -s -r
+ #read -n 1 -s -r
echo ""
echo ""
@@ -732,7 +732,8 @@
# No GUI available - offer to view with less
echo "Would you like to read the EULAs now using 'less'? (y/n)"
echo -n "Answer: "
- read -r view_answer
+ #read -r view_answer
+ view_answer="n"
if [[ "${view_answer,,}" =~ ^y ]]; then
echo ""
@@ -747,7 +748,8 @@
# Simple acceptance prompt
echo ""
echo -n "Do you accept all End User License Agreements? (yes/no): "
- read -r answer
+ #read -r answer
+ answer="y"
case "${answer,,}" in
yes|y)
EOF
|
Use Docker to run Remmina
Remmina is remote access screen and file sharing app (RDP, SSH, VNC)
Summary of steps:
- Create
dockerfile
- Follow notes in
run-docker.sh to setup X11 items
- Run
run-docker.sh to build the image, install latest Remmina, and run Remmina
Save the following as dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | cat << "EOF" > dockerfile
# Debian 12 (bookworm)
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl \
gnupg \
&& mkdir -p /etc/apt/keyrings
RUN apt-get update && apt-get install -y remmina remmina-common remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc
# Create group and user
RUN groupadd -r appuser && useradd -r -g appuser -m appuser
# Switch to the new user
USER appuser
# Run Remmina
ENTRYPOINT ["remmina"]
EOF
|
Save the following as run-docker.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | cat << "EOF" > run-docker.sh
#!/bin/bash
#
# For X11
# As user obtain xauth -f ~/.Xauthority list|tail -1
# As root xauth add string-from-above-command
# As root xhost +local:docker
#
IMAGE="remmina:bookworm"
docker system prune -f
if docker image inspect "$IMAGE" >/dev/null 2>&1; then
echo "Image $IMAGE exists."
else
echo "Image $IMAGE does not exist."
docker build --network host -t $IMAGE .
fi
docker run --network host --rm -it \
--security-opt seccomp=unconfined \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
$IMAGE
EOF
chmod a+x run-docker.sh
|
Use Docker to run IGEL UMS Java Console
Summary of steps:
- Download latest Universal Management Suite 12 - Linux Installer IGEL App Portal
- Create
dockerfile
- Follow notes in
run-docker.sh to setup X11 items
- Run
run-docker.sh to build the image, install latest IGEL UMS Java Console, and run IGEL UMS Java Console
Save the following as dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 | cat << "EOF" > dockerfile
# Debian 12 (bookworm)
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
# copy ums installer
COPY setup-igel-ums-linux_*.bin /tmp
RUN apt-get update && apt-get install -y --no-install-recommends \
bc \
ca-certificates \
curl \
gnupg \
&& mkdir -p /etc/apt/keyrings \
&& curl -fsSL https://dl-ssl.google.com/linux/linux_signing_key.pub \
| gpg --dearmor -o /etc/apt/keyrings/google-linux.gpg
RUN echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/google-linux.gpg] \
http://dl.google.com/linux/chrome/deb/ stable main" \
> /etc/apt/sources.list.d/google-chrome.list
RUN apt-get update && apt-get install -y google-chrome-stable
RUN chmod +x /tmp/setup-igel-ums-linux_*.bin && \
/tmp/setup-igel-ums-linux_*.bin --nox11 -- --accept-eula yes \
--accept-license-info yes --accept-sso-info yes --silent yes \
--installation-type client --install-dependencies yes --upload-license-file no \
--create-shortcut no
# Remove ums installer
RUN rm -f /tmp/setup-igel-ums-linux_*.bin
# Create group and user
RUN groupadd -r appuser && useradd -r -g appuser -m appuser
# Setup for coping settings out of container
RUN mkdir /export && chown appuser:appuser /export
# Switch to the new user
USER appuser
# Run UMS Java Console
ENTRYPOINT ["/opt/IGEL/RemoteManager/RemoteManager.sh"]
EOF
|
Save the following as run-docker.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 | cat << "EOF" > run-docker.sh
#!/bin/bash
set -euo pipefail
#
# For X11:
# xhost +local:docker
#
xhost +local:docker
IMAGE="igel-ums:bookworm"
EXPORT_DIR="$(pwd)/container-export"
mkdir -p "$EXPORT_DIR"
if docker image inspect "$IMAGE" >/dev/null 2>&1; then
echo "Image $IMAGE exists."
else
echo "Image $IMAGE does not exist. Building it now."
docker build --network host -t "$IMAGE" .
fi
docker run --network host --rm -it \
--user root \
--security-opt seccomp=unconfined \
-e DISPLAY="$DISPLAY" \
-e HOST_UID="$(id -u)" \
-e HOST_GID="$(id -g)" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e PULSE_SERVER=unix:/run/user/777/pulse/native \
-e PULSE_COOKIE=/root/.config/pulse/cookie \
-v /run/user/777/pulse:/run/user/777/pulse \
-v /userhome/config/pulse/cookie:/root/.config/pulse/cookie:ro \
-v "$EXPORT_DIR:/export" \
--device=/dev/dri \
--group-add video \
--group-add audio \
--shm-size=2g \
--entrypoint /bin/bash \
"$IMAGE" \
-c '
set +e
echo "Restoring exported files..."
if [ "$(find /export -mindepth 1 -print -quit 2>/dev/null)" ]; then
cp -a /export/. /home/appuser/
chown -R appuser:appuser /home/appuser
echo "Restore complete."
else
echo "No exported files found."
fi
# Run the UMS Remote Manager as the non-root application user.
runuser -u appuser -- env \
HOME=/home/appuser \
DISPLAY="$DISPLAY" \
PULSE_SERVER="$PULSE_SERVER" \
/opt/IGEL/RemoteManager/RemoteManager.sh
RC=$?
echo "Copying generated files to /export..."
if [ -f /home/appuser/rmconsole.truststore ]; then
cp -a /home/appuser/rmconsole.truststore /export/
else
echo "Warning: /home/appuser/rmconsole.truststore was not found."
fi
cp -a /home/appuser/.* /export/
# Make the copied files belong to the user who started the container.
chown -R "$HOST_UID:$HOST_GID" /export
echo "Export complete: /export"
exit "$RC"
'
echo "Files exported to: $EXPORT_DIR"
EOF
chmod a+x run-docker.sh
|
Use Docker to create Karaoke songs
Convert music files (mp3, flac, etc.) into karaoke format with lrc file.
For lyrics, an attempt is made to find them on Lyrics Web Site and, if not found, will use whisper.cpp to create the lrc file. If whisper.cpp is used, then review / edit .lrc text file.
Take the .mp3 and .lrc files and use with your karaoke system.
For IGEL OS, Spivak Karaoke AppImage can be used.
NOTE: If you don't have an NVIDIA GPU, then the conversion can take some time. On my IGEL OS (no NVIDIA GPU) device it took 7m:35s to create karaoke sample song: ron-neher-sample.mp3.
CPU: Intel Core Ultra 7 165U
Cores: 12
Threads: 14
Maximum speed: 4.9 GHz
Reported current speed: 4.851 GHz
RAM: 64 GB
Outputs:
output/
├── song-karaoke.html
├── song-karaoke.lrc
└── song-karaoke.mp3
Place the songs to be converted into the input/ folder.
The generated HTML embeds the LRC text directly. The MP3 stays external, so keep
song.html and song-karaoke.mp3 in the same directory.
Build:
docker compose build --no-cache
Process All Songs:
docker compose run --rm karaoke
Process Single Song:
docker compose run --rm karaoke "song.mp3"
Open directly in default Browser:
xdg-open "$(realpath output/song.html)"