Dreaming Andy - Fotolia

Mit PowerShell und Docker über Betriebssysteme hinweg testen

Mit PowerShell-Skripten in Docker-Containern verwalten Sie mehrere Umgebungen vom selben System aus. Wir zeigen, wie sie auf diesem Weg Linux-Maschinen mit Windows-Hosts testen.

Der Funktionsumfang von PowerShell hat sich im Laufe der Jahre stark erweitert. Einst ausschließlich für Windows-Umgebungen gedacht, läuft die Befehlszeilenschnittstelle jetzt auf allen wichtigen Betriebssystemen, plattformübergreifend und in Containern.

Docker-Container gehören zu den interessantesten neuen Einsatzmöglichkeiten, da Entwickler und Administratoren auf diesem Weg mehrere Umgebungen auf demselben System auszuführen. Zusätzlich zu allen normalen Vorteilen von Docker-Containern können IT-Profis mit PowerShell nutzen, um ihre PowerShell-Skripte in verschiedenen Betriebssystemen zu testen, ohne dass eine vollständige Installationen erforderlich sind.

Lassen Sie uns einen genaueren Blick darauf werfen, wie dieser Prozess funktioniert.

So führen Sie PowerShell in einem Docker-Container aus

Um PowerShell in einem Docker-Container auszuführen, müssen Sie zunächst Docker installieren. Für die Zwecke dieser Anleitung führen wir alle Schritte auf einem Windows-10 x64-Computer mit installiertem Docker Desktop durch.

Wenn Docker installiert ist, führen Sie den folgenden Befehl aus, um das Docker-Image in ein lokales Repository zu ziehen:

docker pull mcr.microsoft.com/powershell

Die Ausgabe sollte ähnlich wie in Abbildung 1 aussehen.

Abbildung 1: Ziehen Sie ein Image aus dem Docker Repository.
Abbildung 1: Ziehen Sie ein Image aus dem Docker Repository.

Dieser Befehl lädt standartmäßig das passende Image für Ihr Host-Betriebssystem herunter – Windows Server Core für Windows, Ubuntu 18.04 für Linux. Sie können jedoch ein Image gezielt abrufen, wenn Sie ein Tag angeben. Wenn Sie  zum Beispiel Ubuntu 18.04 mit PowerShell abrufen möchten, führen Sie den folgenden Befehl aus:

docker pull mcr.microsoft.com/powershell:ubuntu-18.04

Dies führt zu einer Ausgabe, wie sie in Abbildung 2 zu sehen ist.

Abbildung 2: So laden Sie gezielt Ubuntu 18.04 mit PowerShell.
Abbildung 2: So laden Sie gezielt Ubuntu 18.04 mit PowerShell.

Führen Sie mit dem heruntergeladenen Image eine interaktive Version des PowerShell-Docker-Containers mit dem folgenden Befehl aus:

docker run -it mcr.microsoft.com/powershell:ubuntu-18.04

Die Ausgabe sollte aussehen, wie in Abbildung 3.

Abbildung 3: Führen Sie den Container aus.
Abbildung 3: Führen Sie den Container aus.

Überprüfen Sie nun, dass Sie tatsächlich Linux ausführen:

$PSVersionTable

Die Ausgabe enthält Linux in der OS-Zeichenfolge, wie in Abbildung 4 zu sehen ist.

Abbildung 4: PowerShell gibt eine Tabelle aus.
Abbildung 4: PowerShell gibt eine Tabelle aus.

Wenn Sie PowerShell in Docker ausführen, haben Sie Zugriff auf Versionen und Betriebssysteme, die sich nicht auf Ihrem Host-Computer befinden. Dadurch können Sie Skripte in vielen Umgebungen testen, ohne vollständige Virtuelle Maschinen aufsetzen zu müssen.

In diesem Beispiel haben wir einen Docker-Container mit PowerShell unter Ubuntu gestartet, während auf dem Host-System Windows 10 läuft. Ein Windows-Administrator kann also mit diesem Setup seine PowerShell-Skripte und -Befehle auf einem Linux-basierten Betriebssystem testen.

So führen Sie ein PowerShell-Skript in einem Docker-Container aus

Um ein PowerShell-Skript in einem Container auszuführen, müssen Sie einen Container mit dem ausgewählten Image erstellen, das Skript in den Container kopieren und es dann ausführen.

Schreiben Sie zunächst ein PowerShell-Skript, das Sie in einem Docker-Container ausführen möchten. Der Einfachheit halber verwenden wir ein einfaches zweizeiliges Skript, das die aktuelle PowerShell-Version ausgibt und dann die Uhrzeit für die IP-Adresse des Benutzers anfordert:

$PSVersionTable

Invoke-RestMethod -Uri 'http://worldtimeapi.org/api/ip'

Mit diesem Skript fragen Sie die PowerShell-Version und die World Time API ab.

Erstellen Sie nun einen Docker Container namens Demo mit dem folgenden Befehl.

docker create -ti --name demo mcr.microsoft.com/powershell:ubuntu-18.04

Haben Sie den Container generiert, kopieren Sie mit dem untenstehenden Befehl Ihr Skript:

docker cp C:\scripts\time.ps1 demo:/root/time.ps1

Beachten Sie, dass das Skript direkt in das Profil des Root-Nutzers kopiert wird.

Im Anschluss führen Sie den Docker Container aus:

docker start demo

Mit den nächsten Befehl starten Sie das Skript:

docker exec demo pwsh -command "/root/time.ps1"

Dies sollte die Version von PowerShell auf dem Ubuntu-Container und die korrekte Zeit basierend auf dem Standort der öffentlichen IP ausgeben, wie in Abbildung 5.

Abbildung 5: Im Container wir die PowerShell-Version und die Weltzeit ausgegeben.
Abbildung 5: Im Container wir die PowerShell-Version und die Weltzeit ausgegeben.

Wozu sollten Sie PowerShell in Docker ausführen?

Wie bereits erwähnt, vereinfachen Sie mit der vorgestellten Methode den Testprozess über Systeme hinweg. Das hilft Ihnen dabei, grundlegende Unterschiede zwischen den Betriebssystemen und durch sie entstehende Fehler zu entdecken, bevor Ihr Skript in die produktive Umgebung wechselt. Lassen Sie uns ein weiteres Beispiel durchspielen, um dies zu verdeutlichen.

Nehmen wir an, wir haben ein Skript, das mit einer Konfigurationsdatei im JSON-Format kommt. Die Datei enthält einige Einstellungen sowie einen verschlüsselten Autorisierungs-Token, der zur Authentifizierung bei einer API dient. Diese Konfiguration sieht wahrscheinlich so ähnlich aus wie in Abbildung 6.

Abbildung 6: Das PowerShell-Skript und die zugehörige JSON-Datei liegen in einem Windows-Ordner.
Abbildung 6: Das PowerShell-Skript und die zugehörige JSON-Datei liegen in einem Windows-Ordner.

Der Einfachheit halber fügen wir nur ein paar Zeilen in das Skript ein, um die Konfigurationsdatei zu laden und ihren Inhalt auszugeben:

$config = Get-Content $PSScriptRoot\Config.json | ConvertFrom-Json

Write-Host $config | ConvertTo-Json

Wenn ich das auf meinem Windows-10-Computer ausprobiere, erhalte ich folgende Ausgabe in PowerShell 7.1.2.

Testen wir als nächstes unseren Docker-Container. Hier ist der zugehörige Befehl:

docker cp C:\scripts\TechTarget\script.ps1 demo:/root/script.ps1

docker cp C:\scripts\TechTarget\config.json demo:/root/config.json

docker exec demo pwsh -command "/root/script.ps1"

Jetzt, da das Skript in einer Linux-Umgebung ausgeführt läuft, schlägt es fehl, obwohl es mit der gleichen Version von PowerShell ausgeführt wird.

Abbildung 7: Die Konsole gibt einen Fehler für Linux aus.
Abbildung 7: Die Konsole gibt einen Fehler für Linux aus.

Wenn wir Get-ChildItem in diesem Verzeichnis ausführen, sehen wir, dass die Datei config.json vorhanden ist.

Abbildung 8: Die Konsole bestätigt, dass die config.json-Datei existiert.
Abbildung 8: Die Konsole bestätigt, dass die config.json-Datei existiert.

Das Skript konnte die Konfigurationsdatei nicht finden, weil es nach Config.json gesucht hat, während die Datei config.json heißt. Linux unterscheidet zwischen Groß- und Kleinschreibung, während Windows dies nicht tut. Langjährigen Windows-Benutzern fällt das mitunter nicht sofort auf.

Wenn wir also das Skript auf die richtige Groß- und Kleinschreibung umstellen und dann die Skriptdatei auf dem Linux-Container aktualisieren, sollten wir die erwartete Ausgabe erhalten, die in Abbildung 9 zu sehen ist.

Abbildung 9: Der Linux-Container liefert nun die erwartete Ausgabe.
Abbildung 9: Der Linux-Container liefert nun die erwartete Ausgabe.

Das Ausführen von PowerShell in einem Docker-Container ist so, als würden Sie zum ersten Mal lernen, wie man eine PowerShell-Eingabeaufforderung anpasst. Sie hätten nie gedacht, dass Sie es brauchen, bis Sie diese eine elegante Eingabeaufforderung in einer Demo gesehen haben, und jetzt tüfteln Sie selbst an Ihren Befehlen.

Da PowerShell ein plattformübergreifendes Tool ist, lohnt es sich, die Unterschiede für Skripte auf anderen Betriebssystemen zu verstehen. Mit einem einfachen Docker-Container können Sie mit Linux experimentieren und Ihre Fähigkeiten ausbauen.

Erfahren Sie mehr über Serverbetriebssysteme

ComputerWeekly.de
Close