Dann mountest du dein Host-Verzeichnis /var/lib/z2m-test im Container als /var/lib/gladysassistant
Dann sagst du Gladys, dass er mit /var/lib/gladysassistant arbeiten soll, was er tut, wenn er die Mosquitto- und Z2M-Konfigurationsdateien erstellt. Deshalb findest du die Konfigurationsdateien auch in /var/lib/z2m-test auf deinem Host.
Wenn Gladys die anderen Container (Mosquitto und Z2M) erstellt, verwendet er die Variable SQLITE_FILE_PATH, um die Volumes zu mounten. Also das /var/lib/gladysassistant deines Hosts… Da liegt das Problem. Ich weiß nicht, wie ich erkennen soll, dass /var/lib/gladysassistant tatsächlich ein Mount von /var/lib/z2m-test ist.
Ich schlage vor, dass du dies mit dieser docker-compose-Datei versuchst :
Die Konfigurationsdateien müssen von Gladys irgendwo auf deinem Host geschrieben werden. Ich habe beschlossen, SQLITE_FILE_PATH als das Verzeichnis zu verwenden, in dem diese Dateien geschrieben werden. Aber ohne an den Fall zu denken, in dem du dieses Verzeichnis von einem anderen Pfad auf deinem Host einbindest.
Aber vielleicht sollte man dafür eine andere Variable verwenden? Zum Beispiel HOST_PATH_Z2M_FILES?
Ich bin nicht einverstanden, alle Bilder, die ich bisher verwendet habe, erlauben es, einen anderen Persistenzpfad als den offiziellen zu verwenden.
Das eigentliche Problem, das wir hier haben, ist, dass wir mehrere Pfade angeben müssen, wenn wir einen alternativen Pfad verwenden.
Müssen wir wirklich einen Pfad für die Datenbank angeben? Können wir nicht einfach alle Dateien im Container in einem einzigen Ordner, z. B. /var/lib/gladysassistant, ablegen und den Wert von SQLITE_FILE_PATH festlegen (und ihn somit aus der Konfiguration entfernen) und dem Benutzer dann einfach die Angabe des Werts PERSISTANCE_FOLDER (z. B.) abverlangen, der eine Zuordnung zwischen dem Ordner des Containers und dem Host vornimmt?
Hier haben wir einen Fall, in dem wir, wenn wir mehrere Gladys-Bilder testen möchten, alle Pfade in der Konfiguration ändern müssen, den SQLITE_FILE_PATH, den Ordner im Container und den Ordner der Zuordnung auf dem Host.
Tatsächlich funktioniert jetzt alles einwandfrei. Es stimmt, dass man, wie in meiner vorherigen Nachricht erwähnt, drei Werte ändern muss, um dies zu erreichen, aber alle Probleme sind gelöst.
Die beiden Aquara-Gerätetypen, die ich habe, funktionieren gut, der Pfad der Dateien wurde korrekt geändert und die Daten werden korrekt im Dashboard angezeigt. Großartige Arbeit an alle, die an dieser Integration gearbeitet haben.
Lies mich nochmal, ich habe nicht gesagt, dass es technisch nicht möglich ist. Ich habe nur gesagt, dass man nicht alle Gladys-Instanz in der Produktion explodieren lassen kann. Denn diese Änderung zerstört alles.
Genau, ein besonderer Fall, nicht in der Produktion. Der Befehl von @cicoub13 funktioniert perfekt, weil alle Pfade übereinstimmen.
Warum macht man es nicht einfach wie bei der Portfreigabe mit Docker?
Zum Beispiel startet eine Anwendung standardmäßig auf Port 3456, aber du möchtest den Port 80 öffentlich freigeben, dann verwendest du die Option -p 80:3456.
Für mich sollte es bei Gladys genauso sein: Alles wird standardmäßig im Container unter /var/lib/gladysassistant gespeichert und die Änderung des Pfades erfolgt durch die Änderung des Container-Pfades: -v /data/beispiel/Gladys:/var/lib/gladysassistant.
Das erscheint mir einfacher zu machen und zu verstehen!
@cicoub13 Ich habe gerade schnell ein kleines Stück js mit der von uns verwendeten Bibliothek getestet, ohne es wirklich zu Ende zu führen.
var Docker = require('dockerode');
var docker = new Docker({socketPath: '/var/run/docker.sock'});
// HIER kann man gladys durch os.hostname ersetzen
var container = docker.getContainer('gladys');
container.inspect(function (err, data) {
var string = JSON.stringify(data);
var objectValue = JSON.parse(string);
console.log(objectValue['HostConfig']['Binds']);
});
Nicht schlecht. Ich mag die Idee. Aber wie bekomme ich das Richtige zurück? Da man jeden Ordner des Hosts und jeden Ordner in Docker (mit SQLITE_FILE_PATH) einbinden kann.
Und sogar mehrere Ordner.
Ich möchte sagen, dass SQL die Datenbank ist, egal was passiert.
Gladys muss in jedem Fall (für den MQTT- und Zigbee-Teil) ihre Konfiguration in /var/lib/gladysassystant schreiben, dort sind wir im Container.
Wenn man die Bindung auf der Host-Seite abruft, kann man sie verwenden, um die anderen Container zu erstellen und die Persistenz zu verwalten.
Mein vorheriger Post ist kein gutes Beispiel, da ich denselben Pfad binde. Aber nehmen wir zum Beispiel den Fall von @Albenss
@VonOx das scheint mir eine gute Lösung zu sein Tatsächlich würde dies verhindern, dass der Benutzer gezwungen wird, diese Daten in /var/lib/gladysassistant auf dem Host zu speichern, wenn er diesen Ordner nicht zur Verfügung hat.
Einziger Hinweis, auf der JS-Seite müssen wir den Regex mit dem basePath und nicht mit /var/lib/gladysassistant laufen lassen, und dann sind wir fertig!
@cicoub13 integrierst du das in die PR Zigbee2mqtt?
Abgesehen davon bin ich bereit, die PR zigbee2mqtt zu mergen, ich habe dein Video gesehen @cicoub13 und es ist der Hammer! Das ist wirklich großartige Arbeit, nichts zu beanstanden Herzlichen Glückwunsch an alle, die an dieser PR gearbeitet haben, das ist großartig!
Intern muss es immer /var/lib/gladysassistant sein. (Standard festlegen)
Diese Variable (SQLITE_FILE_PATH) muss standardmäßig in der Image mit diesem Pfad enthalten sein.
Hier müssen wir diese Variable (nur für die DB verwendet) und das Persistenz-Bind verwalten
Für die Erstellung der Service-Container zählt nur das Host-Bind, egal wo die DB im Container liegt.
Es gibt zwei Themen:
Wie die „datas“ von gladys im Image verwalten => Standardmäßig /var/lib/gladysassistant
Wie Service-Container erstellen, die denselben Host-Bind-Pfad wie gladys verwenden => Die Funktion, die ich vorschlage (/???/??? auf /var/lib/gladysassistant gebunden)