Ho problemi a riferirti alla documentazione, il che significa che o non ho ancora avuto il mio caffè (vero) o che ci manca della documentazione ( aggiornamento : alcuni documenti qui )
Quando si dichiarano app nella propria app snapcraft.yaml
, si genera un wrapper binario generato al momento dell'installazione e inserito in /snap/bin/
, chiamato in base al nome del pacchetto e dell'app (si noti che se l'app è un servizio, questo wrapper è invece un file systemd .service).
Tale wrapper contiene la maggior parte dell'ambiente in cui verrà eseguita l'applicazione. Le due variabili d'ambiente che sono più rilevanti per questa domanda sono SNAP_DATA
e SNAP_USER_DATA
.
SNAP_DATA
è un'area scrivibile a livello di sistema (in /var/snap/
). Questo potrebbe essere usato per ospitare registri per servizi, ad esempio.
SNAP_USER_DATA
è un'area scrivibile specifica dell'utente nella home directory dell'utente che esegue l'applicazione (in particolare /home/<user>/snap/
). Questo potrebbe essere usato per file di configurazione specifici dell'utente, ecc.
Entrambe queste directory sono molto importanti per la funzionalità di aggiornamento / rollback, dal momento che entrambe sono versionate . Cioè, ogni versione di un determinato snap ha la sua copia di queste directory. Lasciami spiegare con un esempio.
Supponi di aver installato la versione 1 dello snap "pippo". Ciò creerà due directory:
/var/snap/foo/1
( SNAP_DATA
)
/home/<user>/snap/foo/1
( SNAP_USER_DATA
)
Ora dì "foo" usa entrambi. Forse ha un servizio che ospita un database SNAP_DATA
e un binario che usa i file di configurazione SNAP_USER_DATA
.
Ora viene rilasciata la versione 2 di "pippo", che viene automaticamente aggiornata. La prima cosa che succede è che /var/snap/foo/1
viene copiato /var/snap/foo/2
e in cui /home/<user>/snap/foo/1
viene copiato /home/<user>/snap/foo/2
. Quindi viene attivata la nuova versione. Dovrebbe notare che è in esecuzione su vecchi dati e forse ha alcune migrazioni del database da eseguire sul database SNAP_DATA
. Lo fa e se ne va.
Ora supponiamo che quelle migrazioni falliscano per qualsiasi motivo e che questa applicazione debba essere ripristinata. Inizia a utilizzare la vecchia versione dell'applicazione / snap / foo, dove SNAP_DATA
puntava /var/snap/foo/1
e SNAP_USER_DATA
puntava /home/<user>/snap/foo/1
. Questo raccoglie le cose sulla versione precedente nel punto precedente l'esecuzione delle migrazioni, dal momento che quelle operazioni venivano eseguite su una copia dei dati.
Per farla breve: non utilizzare l' home
interfaccia per archiviare i dati in cui è possibile archiviare SNAP_DATA
o SNAP_USER_DATA
, poiché sono parte integrante della strategia di aggiornamento / rollback. Approfitta di loro!
AGGIORNAMENTO per v2.0.10:
Sono state inoltre introdotte due nuove directory di dati:
SNAP_COMMON
si trova a fianco SNAP_DATA
, ma è specificamente non rivisto . Ogni revisione dello snap specifico ha accesso a questa directory, quindi non viene copiata al momento dell'aggiornamento / rollback, ecc. Potrebbe essere utilizzata per file particolarmente grandi e non controllati (ad es. Dati grezzi che non sono specifici della versione).
SNAP_USER_COMMON
si trova a fianco SNAP_USER_DATA
, ma è di nuovo specificamente non visto . Potrebbe essere utilizzato per la memorizzazione di dati non specifici della versione per utente.
AGGIORNAMENTO per v2.15:
I file inseriti /snap/bin
non sono più wrapper che definiscono l'ambiente, ma collegamenti simbolici a /usr/bin/snap
. Quindi, il modo per determinare l'ambiente in cui viene eseguita un'applicazione sarebbe utilizzare snap run --shell <snap>.<app>
, ad esempio:
$ 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 non viene creato automaticamente da snapd? Lo script di avvio in/snap/bin/
non lo crea e la creazione manuale all'interno dello snap ha esito negativo (autorizzazione negata). L'esecuzionesnap run app
crea però quella cartella (ma il comando fallisce conexecv failed: No such file or directory
... Non ho idea di come usare quel comando).