Verwenden Sie Skripte, um Docker-Images mit einem Klick zu verpacken und hochzuladen

Verwenden Sie Skripte, um Docker-Images mit einem Klick zu verpacken und hochzuladen

Der Autor arbeitet seit über einem Jahr an einem Micro-Frontend-Projekt. Ein Team verwaltet zehn Mikroanwendungen. Nach der Umstellung auf die Bereitstellung von Docker-Images hat sich der Release-Vorgang von 1 Minute, wenn das ursprüngliche Skript direkt eine Verbindung zum Server herstellt, auf Dutzende von Minuten geändert, insbesondere beim Hochladen jeder Anwendung in ihr jeweiliges Alibaba Cloud-Lager. Hier schreiben wir ein weiteres Skript, um das Docker-Image mit einem Klick zu verpacken und in die Alibaba Cloud hochzuladen.

In diesem Artikel wird nur darüber gesprochen, wie man ein Skript erstellt, um die Belastung der Entwickler zu verringern. Informationen zur Konfiguration von Docker-Compose finden Sie unter: Bequemes Bereitstellen von Micro-Frontend-Projekten mithilfe verschiedener Haltungen (Teil 1: Verpacken und Hochladen)

Rendern

Direkt auf dem Code

/**
 * @name Docker-Image-Verpackungs- und Upload-Skript * @author weilan
 * @Zeit 2021.02.22
 */
const fs = erfordern('fs');
const path = require('Pfad');
const util = erfordern('util');
const { log } = erfordern('../utils/log');
const exec = util.promisify(require('child_process').exec);
const sub_app_ath = Pfad.resolve();
let sub_apps = fs.readdirSync(sub_app_ath).filter(i => /^subapp|master/.test(i));
const inquirer = require('inquirer'); // Für Befehlszeileninteraktion/**
 * @name Konfigurationselement für die Befehlszeileninteraktion*/
const Frage = [
 {
  Typ: 'bestätigen',
  Name: "dist",
  Nachricht: ,,Müssen Sie die statischen Front-End-Ressourcen verpacken? ',
 },
 {
  Typ: 'bestätigen',
  Name: "Umgebung",
  Meldung: „Bitte wählen Sie aus, ob Sie es für die Offline-Intranet-Bereitstellung verpacken müssen“,
  wann: Funktion (Antworten) { // Die aktuelle Frage wird nur gestellt, wenn die Antwort wahr ist. returniere Antworten.dist
  }
 },
 {
  Typ: 'Kontrollkästchen',
  Name: "Apps",
  Meldung: 'Bitte wählen Sie das zu veröffentlichende Modul aus',
  Auswahlmöglichkeiten: Unteranwendungen,
  validieren: Funktion (Wert) {
   if (val.length) { // prüfen return true;
   }
   return "Die Auswahl darf nicht leer sein";
  }
 },
]

/**
 * @name Führen Sie eine logische Verarbeitung basierend auf den Ergebnissen der Befehlsinteraktionskonfiguration durch*/
inquirer.prompt(Frage).dann(async (Antwort) => {
 Lassen Sie subApps = Antwort.apps;
 let buildScript = answer.env ? 'Garn-Build – Intranet': 'Garn-Build';
 sei needDist = answer.dist;
 lass jetzt = +neues Datum();
 // Bei Alibaba Cloud anmelden const { error: loginError } = await exec('docker login --username=Benutzername--password=Registrierung.cn-zhangjiakou.aliyuncs.com');
 if (Anmeldefehler) {
  log.red(loginError, 'Anmeldung zum Spiegelcenter fehlgeschlagen')
  zurückkehren;
 }
 console.log(`Starten Sie die Verarbeitung von ${JSON.stringify(subApps)} in der Reihenfolge ......`);
 subApps.reduce((Kette, Element) => {
  returniere chain.then(() => publishIamge(item, now, needDist, buildScript))
 }, Versprechen.auflösen())
});

/**
 * @name Verpacke das Image und pushe es in die Alibaba Cloud* @param {String} moduleName Modulname* @param {String} now Zeitstempel der aktuellen Version* @param {Boolean} needDist Gibt an, ob die statischen Front-End-Ressourcen gepackt werden sollen* @param {String} buildScript Befehl zum Packen statischer Front-End-Ressourcen*/
asynchrone Funktion publishIamge(Modulname, jetzt, needDist, BuildScript) {
 //Paket statische Front-End-Ressourcen if (needDist) {
  console.log('Beginnen Sie mit dem Verpacken statischer Front-End-Ressourcen' + moduleName);
  const { Fehler } = warte auf exec(BuildScript, { cwd: Pfad.Resolve(Modulname) });
  if (Fehler) {
   log.red(Modulname, 'Fehler beim Packen des Frontend-Codes:', Fehler)
   zurückkehren;
  }
  log.green(Modulname + 'Frontend-Code erfolgreich gepackt')
 }
 // Abbild verpacken console.log(`Starten Sie das Verpacken des Abbilds ${moduleName} ......`);
 const { stdout: buildStdout, Fehler: buildError } = warte auf exec('docker-compose build ' + Modulname);
 wenn (Build-Fehler) {
  log.red(buildError, 'Fehler beim Spiegelpaketieren')
  zurückkehren;
 }
 log.cyan(buildStdout)
 log.green('Bildverpackung abgeschlossen, beginnen Sie mit der Erstellung von Bild-Tags')
 // Image-Tag aktualisieren const imageName = 'ibp2fe_' + moduleName;
 const { Fehler: tagError } = warte auf exec(`Docker-Tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}:${now}`);
 wenn (tagError) {
  log.red(tagError, 'Ausnahme Spiegeltag')
  zurückkehren;
 }
 log.green('Tag der Spiegelversion aktualisiert, mit der Aktualisierung des letzten Tags beginnen')
 // Aktualisiere die letzte Version des Image-Tags const { error: tagLastError } = await exec(`docker tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}`);
 if (tagLetzterFehler) {
  log.red(tagError, 'Ausnahme letztes Tag spiegeln')
  zurückkehren;
 }
 log.green('Zuletzt aktualisiertes Tag spiegeln, Hochladen starten')
 const { stdout: pushStdout, Fehler: pushError } = warte auf exec('docker push registry.cn-zhangjiakou.aliyuncs.com/futureweb/' + imageName);
 wenn (pushError) {
  log.red(pushError, 'Bild-Upload fehlgeschlagen')
  zurückkehren;
 }
 log.cyan(pushStdout)
 log.green('Bild-Upload erfolgreich')
}

Prozess.Ein('unbehandelteAblehnung', (Grund, p) => {
 console.log('Unbehandelte Ablehnung bei: Promise', p, 'Grund:', Grund);
 // anwendungsspezifisches Logging, Auslösen eines Fehlers oder andere Logik hier
});

Umsetzungsideen und Vorsichtsmaßnahmen

  • Berücksichtigen Sie zunächst die Methode zur Befehlszeileninteraktion, lassen Sie den Entwickler die Konfiguration bestätigen, die selektiv durchgeführt werden muss, und wählen Sie schließlich die freizugebenden Module aus.
  • Melden Sie sich vorab bei Ihrem Alibaba Cloud-Konto an
  • Hier können Sie alle ausgewählten Module gleichzeitig ausführen, aber die Protokollausgabe wird nicht in der richtigen Reihenfolge erfolgen und der Computer wird aufgrund des hohen Drucks vorübergehend einfrieren. Daher verwende ich hier die sequentielle Verarbeitungsmethode.
  • Verpacken Sie die statischen Front-End-Ressourcen des ausgewählten Moduls
  • Führen Sie docker-compose build xxx aus, um das ausgewählte Modul-Image zu verpacken

Hier ist ein Punkt zu beachten. Da dies von Toolfunktionen gehandhabt wird, wird der Pfad jedes Moduls von Knoten gelesen, sodass Ihr Modulname mit dem Dienstnamen und dem Containernamen in docker-compose.yml übereinstimmen muss. Beachten Sie außerdem, dass nach dem Verpacken Ihres Images der Unterstrich des Stammverzeichnisses außerhalb Ihrer docker-compose.yml mit Ihrem Docker-Compose-Dienstnamen verbunden ist, sodass Ihr Alibaba Cloud-Image-Repository einen Namen haben sollte, der mit dem kombinierten Imagenamen übereinstimmt. Das Obige soll der Toolfunktion die universelle Handhabung der Images verschiedener Module erleichtern.

  1. Erstellen Sie ein Spiegeltag. Hier werde ich eine Version mit dem Zeitstempel dieser Veröffentlichung und eine letzte Version erstellen. Erstere ist praktisch für Rollbacks und letztere ist praktisch für Betriebs- und Wartungsbereitstellungen, ohne dass man sich um die Tag-Version kümmern muss. Sie können auch das Git-Tag ziehen, um das Image-Tag zu erstellen.
  2. Nachdem Sie das Bild erstellt haben, laden Sie es in das Alibaba Cloud Image Center hoch
Das könnte Sie auch interessieren:
  • Löschen Sie den Image-Vorgang von „none“ in Docker-Images
  • Lösen Sie das Problem verschwindender Docker-Images
  • So bedienen Sie Docker und Images
  • Codebeispiele für den Import und Export von Docker-Images
  • Lösung für das zu langsame Herunterladen des Docker-Images
  • Analyse des Docker-Image-Erstellungsprinzips (Sie können ein Image erstellen, ohne Docker zu installieren)
  • Verwenden Sie das Docker-Buildkit, um ein Docker-Image zu erstellen, das auf dem Raspberry Pi verwendet werden kann
  • Schritte zur vollständigen Deinstallation des Docker-Images

<<:  HTML-Codebeispiel: Detaillierte Erklärung von Hyperlinks

>>:  Detaillierte Erklärung der Semiotik in Html/CSS

Artikel empfehlen

So vereinfachen Sie Redux mit Redux Toolkit

Inhaltsverzeichnis Probleme, die Redux Toolkit lö...

jQuery-Plugin zum Erreichen eines Bildvergleichs

In diesem Artikelbeispiel wird der spezifische Co...

Detaillierte Erklärung der Linux-CPU-Last und CPU-Auslastung

CPU-Last und CPU-Auslastung Beides kann bis zu ei...

VMware Workstation-Installation (Linux-Kernel) Kylin-Grafik-Tutorial

In diesem Artikel erfahren Sie, wie Sie Kylin auf...

Einführung in die Überwachung des MySQL MHA-Betriebsstatus

Inhaltsverzeichnis 1. Projektbeschreibung 1.1 Hin...

Linux-Unlink-Funktion und wie man Dateien löscht

1. Unlink-Funktion Bei Hardlinks wird mit „unlink...

Detaillierte Schritte zur Installation von Tomcat, MySQL und Redis mit Docker

Inhaltsverzeichnis Tomcat mit Docker installieren...

Aggregatabfrage- und Union-Abfragevorgänge für MySQL-Datenbanken

Inhaltsverzeichnis 1. Einfügen der abgefragten Er...

Lösung für das Problem mit verstümmeltem MySQL-Code unter Linux

Das Projekt interagiert mit dem Server, greift üb...

MySQL 8.0.25 Installations- und Konfigurations-Tutorial unter Linux

Das neueste Tutorial zur Installation von MySQL 8...

Detaillierte Erklärung der Schritte zum Erstellen eines Webservers mit node.js

Vorwort Es ist sehr einfach, einen Server in node...

Detaillierte Beispiele zur Ajax-Verwendung in js und jQuery

Inhaltsverzeichnis Natives JS So senden Sie eine ...

js, um eine einfache Lotteriefunktion zu erreichen

In diesem Artikel wird der spezifische Code von j...