Update 28.09.2015
Ich habe bemerkt, dass dieser Beitrag ein bisschen Aufmerksamkeit erhält. Ein Ratschlag für alle, die möglicherweise daran interessiert sind, so etwas zu tun. Ich würde versuchen, Python oder eine andere Sprache als Wrapper für Ihre Skriptausführungen zu verwenden. Beim Ausführen nativer Bash-Skripte hatte ich Probleme, als ich versuchte, verschiedene Argumente an meine Container weiterzuleiten. Insbesondere gab es Probleme mit der Interpretation / Flucht von "und" Zeichen durch die Shell.
Ich musste den Benutzer aus einem etwas anderen Grund wechseln.
Ich habe ein Docker-Image erstellt, das eine voll funktionsfähige Installation von ImageMagick und Ffmpeg enthält, mit dem Wunsch, dass ich Transformationen für Bilder / Videos in meinem Host-Betriebssystem durchführen kann. Mein Problem war, dass dies Befehlszeilentools sind, daher ist es etwas schwieriger, sie über Docker auszuführen und die Ergebnisse dann wieder in das Host-Betriebssystem zu übertragen. Ich habe es geschafft, dies durch das Mounten eines Docker-Volumes zu ermöglichen. Dies schien in Ordnung zu sein, außer dass die Bild- / Videoausgabe im Besitz von root war (dh dem Benutzer, unter dem der Docker-Container ausgeführt wurde) und nicht dem Benutzer, der den Befehl ausgeführt hat.
Ich habe mir den Ansatz angesehen, den @ François Zaninotto in seiner Antwort erwähnt hat (das vollständige Make-Skript finden Sie hier ). Es war wirklich cool, aber ich bevorzugte die Option, ein Bash-Shell-Skript zu erstellen, das ich dann auf meinem Pfad registrieren würde. Ich habe einige der Konzepte aus dem Makefile-Ansatz übernommen (insbesondere die Benutzer- / Gruppenerstellung) und dann das Shell-Skript erstellt.
Hier ist ein Beispiel für mein Dockermagick- Shell-Skript:
#!/bin/bash
DOCKER_IMAGE='acleancoder/imagemagick-full:latest'
CONTAINER_USERNAME='dummy'
CONTAINER_GROUPNAME='dummy'
HOMEDIR='/home/'$CONTAINER_USERNAME
GROUP_ID=$(id -g)
USER_ID=$(id -u)
create_user_cmd()
{
echo \
groupadd -f -g $GROUP_ID $CONTAINER_GROUPNAME '&&' \
useradd -u $USER_ID -g $CONTAINER_GROUPNAME $CONTAINER_USERNAME '&&' \
mkdir --parent $HOMEDIR '&&' \
chown -R $CONTAINER_USERNAME:$CONTAINER_GROUPNAME $HOMEDIR
}
execute_as_cmd()
{
echo \
sudo -u $CONTAINER_USERNAME HOME=$HOMEDIR
}
full_container_cmd()
{
echo "'$(create_user_cmd) && $(execute_as_cmd) $@'"
}
eval docker run \
--rm=true \
-a stdout \
-v $(pwd):$HOMEDIR \
-w $HOMEDIR \
$DOCKER_IMAGE \
/bin/bash -ci $(full_container_cmd $@)
Dieses Skript ist an das Bild 'acleancoder / imagemagick-full' gebunden. Dies kann jedoch durch Bearbeiten der Variablen oben im Skript geändert werden.
Was es im Grunde tut, ist:
- Erstellen Sie eine Benutzer-ID und eine Gruppe im Container , die dem Benutzer entsprechen, der das Skript vom Host-Betriebssystem aus ausführt .
- Hängt das aktuelle Arbeitsverzeichnis des Host-Betriebssystems (unter Verwendung von Docker-Volumes) in das Ausgangsverzeichnis für den Benutzer ein, den wir im ausführenden Docker-Container erstellen .
- Legt das tmp-Verzeichnis als Arbeitsverzeichnis für den Container fest .
- Übergibt alle Argumente, die an das Skript übergeben werden, das dann vom ' / bin / bash ' des ausführenden Docker-Containers ausgeführt wird .
Jetzt kann ich die ImageMagick / Ffmpeg- Befehle für Dateien auf meinem Host-Betriebssystem ausführen. Angenommen , ich möchte ein Bild MyImage.jpeg in eine PNG- Datei konvertieren , könnte ich jetzt Folgendes tun:
$ cd ~/MyImages
$ ls
MyImage.jpeg
$ dockermagick convert MyImage.jpeg Foo.png
$ ls
Foo.png MyImage.jpeg
Ich habe auch an das 'stdout' angehängt, damit ich den ImageMagick-Identifizierungsbefehl ausführen kann, um Informationen zu einem Bild auf meinem Host abzurufen, z.
$ dockermagick identify MyImage.jpeg
MyImage.jpeg JPEG 640x426 640x426+0+0 8-bit DirectClass 78.6KB 0.000u 0:00.000
Es besteht die offensichtliche Gefahr, das aktuelle Verzeichnis bereitzustellen und die Weitergabe beliebiger Befehlsdefinitionen zur Ausführung zuzulassen. Es gibt aber auch viele Möglichkeiten, das Skript sicherer zu machen. Ich führe dies in meiner eigenen nicht produktiven persönlichen Umgebung aus, daher sind diese für mich nicht von größter Bedeutung. Ich würde Ihnen jedoch wärmstens empfehlen, die Gefahren zu berücksichtigen, wenn Sie dieses Skript erweitern. Erwähnenswert ist auch, dass dieses Skript keinen OS X-Host berücksichtigt. Die make-Datei , aus der ich Ideen / Konzepte stehle, berücksichtigt dies, sodass Sie dieses Skript dazu erweitern können.
Eine weitere Einschränkung ist, dass ich nur auf Dateien verweisen kann, die sich derzeit in dem Pfad befinden, für den ich das Skript ausführe. Dies liegt an der Art und Weise, wie ich die Volumes einbinde, sodass Folgendes nicht funktionieren würde:
$ cd ~/MyImages
$ ls
MyImage.jpeg
$ dockermagick convert ~/DifferentDirectory/AnotherImage.jpeg Foo.png
$ ls
MyImage.jpeg
Gehen Sie am besten in das Verzeichnis, in dem sich das Bild befindet, und führen Sie es direkt aus. Natürlich bin ich mir sicher, dass es auch Möglichkeiten gibt, diese Einschränkung zu umgehen, aber für mich und meine aktuellen Bedürfnisse wird dies ausreichen.
node
Benutzer erstellt wird?