Ich habe Probleme, Sie auf die Dokumentation zu verweisen. Dies bedeutet, dass ich entweder noch keinen Kaffee getrunken habe (true) oder dass wir eine Dokumentation vermissen ( Update : Dokumentation hier ).
Wenn Sie Apps in Ihrem deklarieren snapcraft.yaml
, wird bei der Installation ein Binär-Wrapper generiert /snap/bin/
, der nach Ihrem Paket- und App-Namen benannt wird.
Dieser Wrapper enthält den größten Teil der Umgebung, in der die Anwendung ausgeführt wird. Die beiden Umgebungsvariablen, die für diese Frage am relevantesten sind, sind SNAP_DATA
und SNAP_USER_DATA
.
SNAP_DATA
ist ein systemweiter beschreibbarer Bereich (in /var/snap/
). Dies kann beispielsweise zum Hosten von Protokollen für Dienste verwendet werden.
SNAP_USER_DATA
ist ein benutzerspezifischer beschreibbarer Bereich im Basisverzeichnis des Benutzers, der die Anwendung ausführt (speziell /home/<user>/snap/
). Dies kann für benutzerspezifische Konfigurationsdateien usw. verwendet werden.
Beide Verzeichnisse sind für die Upgrade- / Rollback-Funktionalität sehr wichtig, da beide versioniert sind . Das heißt, jede Version eines bestimmten Snaps verfügt über eine eigene Kopie dieser Verzeichnisse. Lassen Sie mich mit einem Beispiel erklären.
Angenommen, Sie installieren Version 1 des Snaps "foo". Dadurch werden zwei Verzeichnisse erstellt:
/var/snap/foo/1
( SNAP_DATA
)
/home/<user>/snap/foo/1
( SNAP_USER_DATA
)
Sagen wir jetzt, "foo" verwendet beide. Vielleicht hat es einen Dienst, der eine Datenbank in hostet SNAP_DATA
, und eine Binärdatei, die Konfigurationsdateien in verwendet SNAP_USER_DATA
.
Jetzt wird Version 2 von "foo" veröffentlicht und es wird automatisch aktualisiert. Das erste, was passiert, ist, dass /var/snap/foo/1
in /var/snap/foo/2
und /home/<user>/snap/foo/1
in kopiert wird /home/<user>/snap/foo/2
. Dann wird die neue Version gestartet. Es sollte bemerkt werden, dass es auf alten Daten ausgeführt wird und möglicherweise einige Datenbankmigrationen zur Datenbank in ausgeführt werden müssen SNAP_DATA
. Es macht das und weg geht es.
Sagen wir nun, diese Migrationen schlagen aus irgendeinem Grund fehl und diese Anwendung muss zurückgesetzt werden. Es wird die alte Version der Anwendung / snap / foo verwendet, SNAP_DATA
auf die /var/snap/foo/1
und SNAP_USER_DATA
auf die gezeigt wurde /home/<user>/snap/foo/1
. Dies greift die alte Version zum Zeitpunkt vor der Ausführung der Migrationen auf, da diese Vorgänge mit einer Kopie der Daten ausgeführt wurden.
Kurz gesagt: Verwenden Sie die home
Schnittstelle nicht zum Speichern von Daten, die Sie in SNAP_DATA
oder speichern können SNAP_USER_DATA
, da diese ein wesentlicher Bestandteil der Upgrade- / Rollback-Strategie sind. Nutzen Sie sie!
UPDATE für v2.0.10:
Zwei neue Datenverzeichnisse wurden ebenfalls eingeführt:
SNAP_COMMON
sitzt neben SNAP_DATA
, ist aber spezifisch nicht versioniert . Jede Revision des spezifischen Snaps hat Zugriff auf dieses Verzeichnis, sodass es beim Upgrade / Rollback usw. nicht kopiert wird. Dies kann für besonders große, nicht versionierte Dateien (z. B. Rohdaten, die nicht wirklich versionsspezifisch sind) verwendet werden.
SNAP_USER_COMMON
sitzt neben SNAP_USER_DATA
, ist aber wieder spezifisch unversioniert . Es kann zum Speichern nicht versionsspezifischer Daten pro Benutzer verwendet werden.
UPDATE für v2.15:
Die darin platzierten Dateien /snap/bin
sind keine Wrapper mehr, die die Umgebung definieren, sondern Symlinks zu /usr/bin/snap
. Die Möglichkeit, die Umgebung zu bestimmen, in der eine Anwendung ausgeführt wird snap run --shell <snap>.<app>
, besteht beispielsweise darin, Folgendes zu verwenden :
$ sudo snap install hello-world
$ snap run --shell hello-world
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
$ env | grep SNAP
SNAP_USER_COMMON=/home/kyrofa/snap/hello-world/common
SNAP_REEXEC=
SNAP_LIBRARY_PATH=/var/lib/snapd/lib/gl:
SNAP_COMMON=/var/snap/hello-world/common
SNAP_USER_DATA=/home/kyrofa/snap/hello-world/27
SNAP_DATA=/var/snap/hello-world/27
SNAP_REVISION=27
SNAP_NAME=hello-world
SNAP_ARCH=amd64
SNAP_VERSION=6.3
SNAP=/snap/hello-world/27
SNAP_USER_COMMON
dir nicht automatisch von snapd erstellt? Das Startskript in erstellt/snap/bin/
es nicht und das manuelle Erstellen innerhalb des Snaps schlägt fehl (Berechtigung verweigert). Beim Ausführensnap run app
wird dieser Ordner erstellt (aber der Befehl schlägt fehl mitexecv failed: No such file or directory
... Ich habe keine Ahnung, wie dieser Befehl verwendet wird).