Mam problem z odsyłaniem cię do dokumentacji, co oznacza, że albo jeszcze nie miałem kawy (prawda), albo brakuje dokumentacji ( aktualizacja : tutaj jest trochę dokumentacji )
Gdy deklarujesz aplikacje w swoim snapcraft.yaml
, powoduje to generowanie binarnego opakowania podczas instalacji i umieszczanie go /snap/bin/
, nazwanego na podstawie nazwy pakietu i aplikacji (zwróć uwagę, że jeśli aplikacja jest usługą, to opakowanie jest zamiast tego systemowym plikiem .service).
To opakowanie zawiera większość środowiska, w którym aplikacja będzie działać. Dwie zmienne środowiskowe, które są najbardziej istotne dla tego pytania, to SNAP_DATA
i SNAP_USER_DATA
.
SNAP_DATA
jest ogólnosystemowym obszarem do zapisu (w /var/snap/
). Może to służyć na przykład do przechowywania dzienników usług.
SNAP_USER_DATA
jest specyficznym dla użytkownika obszarem do zapisu w katalogu osobistym użytkownika uruchamiającego aplikację (konkretnie /home/<user>/snap/
). Może to być wykorzystane do specyficznych dla użytkownika plików konfiguracyjnych itp.
Oba te katalogi są bardzo ważne dla funkcji aktualizacji / przywracania, ponieważ oba są wersjonowane . Oznacza to, że każda wersja danej przystawki ma własną kopię tych katalogów. Pozwól mi wyjaśnić przykładem.
Załóżmy, że instalujesz wersję 1 przystawki „foo”. To utworzy dwa katalogi:
/var/snap/foo/1
( SNAP_DATA
)
/home/<user>/snap/foo/1
( SNAP_USER_DATA
)
Teraz powiedz „foo” używa obu z nich. Może ma usługę, w której znajduje się baza danych SNAP_DATA
i plik binarny, w którym są używane pliki konfiguracyjne SNAP_USER_DATA
.
Teraz wersja 2 „foo” została wydana i jest automatycznie aktualizowana. Pierwszą rzeczą, która się dzieje, jest to, że /var/snap/foo/1
jest kopiowane /var/snap/foo/2
i /home/<user>/snap/foo/1
kopiowane do /home/<user>/snap/foo/2
. Następnie uruchamiana jest nowa wersja. Powinien zauważyć, że działa na starych danych i być może ma pewne migracje bazy danych do uruchomienia w bazie danych SNAP_DATA
. Robi to i odchodzi.
Powiedzmy teraz, że migracje nie udają się z jakiegokolwiek powodu, a ta aplikacja musi zostać wycofana. Zaczyna używać starej wersji aplikacji / snap / foo, do której SNAP_DATA
wskazywał /var/snap/foo/1
i SNAP_USER_DATA
wskazywał /home/<user>/snap/foo/1
. To zbiera informacje na temat starej wersji w momencie przed uruchomieniem migracji, ponieważ te operacje były uruchamiane na kopii danych.
Krótko mówiąc: nie używaj home
interfejsu do przechowywania danych, w których możesz przechowywać SNAP_DATA
lub SNAP_USER_DATA
, ponieważ są one integralną częścią strategii aktualizacji / wycofywania. Skorzystaj z nich!
AKTUALIZACJA dla wersji 2.0.10:
Wprowadzono również dwa nowe katalogi danych:
SNAP_COMMON
siedzi obok SNAP_DATA
, ale jest szczególnie niewersjonowany . Każda wersja konkretnej przystawki ma dostęp do tego katalogu, więc nie jest kopiowana podczas aktualizacji / przywracania itp. Może to być wykorzystane w przypadku szczególnie dużych, niewersjonowanych plików (np. Surowe dane, które tak naprawdę nie są specyficzne dla wersji).
SNAP_USER_COMMON
siedzi obok SNAP_USER_DATA
, ale ponownie jest szczególnie niewersjonowany . Może być używany do przechowywania danych niespecyficznych dla poszczególnych użytkowników.
AKTUALIZACJA dla wersji 2.15:
Pliki umieszczone w nim /snap/bin
nie są już opakowaniami definiującymi środowisko, ale dowiązaniami symbolicznymi do /usr/bin/snap
. Tak więc sposobem określenia środowiska, w którym działa aplikacja, byłoby użycie snap run --shell <snap>.<app>
na przykład:
$ 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 nie jest tworzony automatycznie przez snapd? Skrypt uruchamiania/snap/bin/
nie tworzy go, a ręczne tworzenie go wewnątrz przystawki kończy się niepowodzeniem (odmowa dostępu). Uruchamianiesnap run app
tworzy ten folder (ale polecenie kończy się niepowodzeniem zexecv failed: No such file or directory
... Nie mam pojęcia, jak użyć tego polecenia).snap run
jest używany).