Aufgaben in Container auslagern mit boxrun - Teil 2

Wie die Arbeit mit Containern in wenigen Schritten vereinfacht werden kann, wurde bereits in Teil 1 vorgestellt. In diesem Artikel wird gezeigt, wie noch weitere Funktionen eingebaut werden können.

Ausgehend von der Konfiguration aus Teil 1 wird zunächst der Alias erweitert. So wird zum Beispiel das Skript für den Entrypoint überschrieben, welches im folgenden Verlauf noch vorgestellt wird. Weiterhin werden zusätzliche Umgebungsvariablen mit Informationen zum Nutzer an den Container übergeben.

alias boxrun2='docker run --rm -v $(pwd):/ext -v $HOME/.boxrun:/.boxrun --entrypoint /.boxrun/boxrun.sh -it --env EXT_UID=$(id -u) --env EXT_GID=$(id -g) --env EXT_USER="$(id -nu)" --env EXT_GROUP="$(id -ng)" --env EXT_HOME=$HOME -it '

Für das Skript welches als Entrypoint verwendet wird, muss zunächst im Home-Verzeichnis auf dem Host-System der Ordner .boxrun angelegt werden. In diesem Ordner wird anschließend das Folgende Skript als boxrun.sh hinterlegt und ausführbar gemacht. Mit Hilfe der über den erweiterten Alias übergebenen Informationen wird zunächst ein Benutzer im Container angelegt, der die gleiche UID und GID wie der Nutzer auf dem Host-System besitzt. Der neu angelegte Nutzer wird anschließend verwendet um den Angegeben Befehl auszuführen. Dies hat den Vorteil, dass alle neu erzeugten Dateien auch extern die passenden Berechtigungen besietzen. Anschließend wird noch versucht unter Systemen mit den Paketmanagern apt oder yum das Paket sudo zu installieren, damit der unpreviligierte Nutzer später auch die Möglichkeit besitzt Befehle als Super-User auszuführen und so zum Beispiel noch weitere Pakete nachinstallieren zu können. Ist dies geschafft, werden noch alle Dateien vom Host-System aus dem Ordner .boxrun/home/ in das Home-Verzeichnis in dem Container kopiert und ermöglichen so weitere Konfigurationsanpassungen in den Container zu übernehmen.

#!/bin/sh
groupadd --gid $EXT_GID $EXT_GROUP
useradd --uid $EXT_UID --gid $EXT_GID --home-dir $EXT_HOME $EXT_USER

test -x /usr/bin/apt-get && apt-get update && apt-get install sudo && echo "$EXT_USER   ALL=(ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers
test -x /bin/yum && yum install -y sudo && echo "$EXT_USER   ALL=(ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers

test -e /.boxrun/home && cp -af /.boxrun/home/. /home/$EXT_USER

COMMAND=$@
if [ $# -eq 0 ]; then
  COMMAND=/bin/sh
fi

cd /ext
runuser -u $EXT_USER -- $COMMAND

Ein neuer Container kann wie gewohnt mit dem folgenden Befehl gestartet werden.

$ boxrun2 debian /bin/bash

Fazit

Die vorgestellten Methoden und Befehle funktionieren wesentlich besser als die in Teil 1, jedoch kommt es durch das Installieren von weiteren Paketen immer wieder zu kleineren Verzögerungen beim Start des Containers. Dies könnte durch ein geschicktes Caching noch weiter optimiert werden.

Links

Verwandte Artikel