Docker, Betriebssystem des Hosts erkennen

Docker, Betriebssystem des Hosts erkennen

Ich erstelle ein Entwicklungs-Setup für eine Web-App mit Docker. Wir haben Entwickler, die unter Windows, Mac und Linux arbeiten. Alle werden Linux-Container verwenden, aber es gibt immer noch Probleme, die nur Windows-Benutzer betreffen.

Ich möchte die Anwendung nicht anders ausführen als in der Produktion. Es sind eher die Tools rund um das Entwickler-Setup, die anders sein müssen.

Gibt es eine Möglichkeit, das Betriebssystem eines Hosts innerhalb eines Docker-Containers zu erkennen?

Antwort1

Willst du das wirklich tun?

Ich weiß, dass Sie mit der Antwort auf eine Rahmenherausforderung nicht zufrieden sind, aber bitte haben Sie Geduld mit mir.

Die Probleme, mit denen Sie konfrontiert sind, treten auf, weil das Ausführen von Linux-basiertem Docker unter Windows ein Hack ist. Natürlich können Sie auf Probleme mit dem Windows-Dateisystem stoßen, aber es kann auch andere Probleme geben, die mir nicht bekannt sind.

Wenn ich das richtig verstehe, möchten Sie Ihrem Projekt plattformspezifische Workarounds hinzufügen, um es in einer VM auf Windows-Hosts ausführen zu können. Aus meiner Erfahrung würde ich empfehlen, dies zu vermeiden.

  1. Windows ist keine Zielplattform für Ihr Projekt. Das Hinzufügen von Lösungen für Windows-spezifische Probleme führt zu unnötiger Komplexität. Unnötige Komplexität bedeutet höhere Wartungskosten und das Risiko von Fehlern, die andernfalls nicht auftreten würden.

  2. Sie werden höchstwahrscheinlich auf weitere Probleme stoßen, die durch Dateisysteminkompatibilität verursacht werden, die zwar nicht unbedingt Projektprobleme sind, aber dennoch unnötigen Ärger unter Windows verursachen. Beispielsweise bricht Git zusammen, wenn jemand bei Dateisystemen, die Groß- und Kleinschreibung beachten (z. B. Linux), nur die Groß- und Kleinschreibung der Dateinamen ändert und eine andere Person diese Änderungen auf einen Windows-Rechner überträgt.

Die wirkliche Lösung wäre, in einer Umgebung zu entwickeln, die der beabsichtigten so ähnlich wie möglich ist. Das heißt: auf einem tatsächlichen Linux-Host oder in einer Linux-VM. Dadurch wird sichergestellt, dass Entwickler keine Zeit (und kein Geld) für Probleme verschwenden, die nur auf ihrer Entwicklungsplattform auftreten. Außerdem wird dadurch sichergestellt, dass sie keine Probleme übersehen, die unter Windows nicht auftreten.

Ihrem Kunden ist es egal, ob das Produkt in einer Linux-VM unter Windows gut läuft. Ihre Entwickler müssen ohnehin mit Linux vertraut sein, da Sie Linux als Ihre einzige Plattform anvisieren.Möchten Sie wirklich Ressourcen für Probleme verschwenden, die in realen Szenarien nicht existieren?

Antwort2

Ich hatte genau das gleiche Problem. Unser Angular-Webentwicklungsfluss hängt von Dateiänderungen ab, die mit Webpack auf zugeordneten Datenträgern erkannt werden.

Leider übergibt Windows keine Dateisystemereignisse (das fseventsPaket, das bei der NPM-Installation immer warnt

Antwort3

Für macOS oder jedes andere Betriebssystem können Entwickler Folgendes in ihrem lokalen Shell-Profil festlegen:

export IS_HOST_MACOS='true'
export HOST_UNAME=$(uname)

Geben Sie es dann über Folgendes in das Docker ein:

docker run -e IS_HOST_MACOS -i HOST_UNAME

Verwenden Sie es abschließend in einem Docker-Skript:

# This is meant to help developers know when the server has booted
if [ -n "${IS_HOST_MACOS+1}" ]; then
  [ "$IS_HOST_MACOS" == "true" ] && echo '{"Nginx is ready":""}';
fi

Antwort4

Da der Container in einer simulierten Umgebung ausgeführt wird, können Sie möglicherweise anhand der bereitgestellten virtuellen Hardware zwischen Windows- und Linux-Hosts unterscheiden.

Zum Beispiel von diese Antwort Ich schließe daraus, dass Docker unter Windows ein Netzwerkgerät namens „vEthernet (DockerNAT)“ erstellt.

Mir steht die Testumgebung nicht zur Verfügung, daher liegt es an Ihnen, eine funktionierende Lösung für Ihre Umgebung(en) zu finden.

verwandte Informationen