Tengo problemas para remitirlo a la documentación, lo que significa que todavía no he tomado mi café (verdadero) o nos falta algo de documentación ( actualización : aquí hay documentación )
Cuando declara aplicaciones en su snapcraft.yaml
, se genera un contenedor binario al momento de la instalación y se coloca en él /snap/bin/
, con el nombre de su paquete y el nombre de la aplicación (tenga en cuenta que si la aplicación es un servicio, este contenedor es un archivo systemd .service).
Ese contenedor contiene la mayor parte del entorno en el que se ejecutará la aplicación. Las dos variables de entorno más relevantes para esta pregunta son SNAP_DATA
y SNAP_USER_DATA
.
SNAP_DATA
es un área de escritura en todo el sistema (in /var/snap/
). Esto podría usarse para alojar registros de servicios, por ejemplo.
SNAP_USER_DATA
es un área de escritura específica del usuario en el directorio de inicio del usuario que ejecuta la aplicación (específicamente /home/<user>/snap/
). Esto podría usarse para archivos de configuración específicos del usuario, etc.
Ambos directorios son muy importantes para la funcionalidad de actualización / reversión, ya que ambos están versionados . Es decir, cada versión de un complemento dado tiene su propia copia de estos directorios. Dejame explicarte con un ejemplo.
Supongamos que instala la versión 1 del complemento "foo". Eso creará dos directorios:
/var/snap/foo/1
( SNAP_DATA
)
/home/<user>/snap/foo/1
( SNAP_USER_DATA
)
Ahora digamos que "foo" usa ambos. Tal vez tiene un servicio que aloja una base de datos SNAP_DATA
y un binario que usa archivos de configuración SNAP_USER_DATA
.
Ahora se lanza la versión 2 de "foo", y se actualiza automáticamente. Lo primero que sucede es que /var/snap/foo/1
se copia /var/snap/foo/2
y /home/<user>/snap/foo/1
se copia /home/<user>/snap/foo/2
. Entonces se enciende la nueva versión. Debe notar que se está ejecutando en datos antiguos, y tal vez tenga algunas migraciones de bases de datos para ejecutar en la base de datos SNAP_DATA
. Hace eso y se va.
Ahora digamos que esas migraciones fallan por cualquier razón, y esta aplicación necesita ser revertida. Comienza usando la versión anterior de la aplicación / snap / foo, donde SNAP_DATA
apuntaba /var/snap/foo/1
y SNAP_USER_DATA
apuntaba /home/<user>/snap/foo/1
. Esto recoge las cosas de la versión anterior en el punto antes de que se ejecutaran las migraciones, ya que esas operaciones se ejecutaron en una copia de los datos.
En pocas palabras: no use la home
interfaz para almacenar datos que puede almacenar SNAP_DATA
o SNAP_USER_DATA
, ya que son una parte integral de la estrategia de actualización / reversión. ¡Aprovecha de ellos!
ACTUALIZACIÓN para v2.0.10:
También se introdujeron dos nuevos directorios de datos:
SNAP_COMMON
se sienta al lado SNAP_DATA
, pero está específicamente sin versión . Cada revisión del complemento específico tiene acceso a este directorio, por lo que no se copia en la actualización / reversión, etc. Esto podría usarse para archivos particularmente grandes y no versionados (por ejemplo, datos sin procesar que no son realmente específicos de la versión).
SNAP_USER_COMMON
se sienta al lado SNAP_USER_DATA
, pero de nuevo está específicamente sin versión . Puede usarse para almacenar datos no específicos de la versión por usuario.
ACTUALIZACIÓN para v2.15:
Los archivos colocados dentro /snap/bin
ya no son contenedores que definen el entorno, sino enlaces simbólicos a /usr/bin/snap
. Entonces, la forma de determinar el entorno en el que se ejecuta una aplicación sería utilizar snap run --shell <snap>.<app>
, por ejemplo:
$ 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
se crea el directorio automáticamente por snapd? La secuencia de comandos del iniciador/snap/bin/
no lo crea, y la creación manual dentro del complemento falla (permiso denegado). Sinsnap run app
embargo, la ejecución crea esa carpeta (pero el comando falla conexecv failed: No such file or directory
... No tengo idea de cómo usar ese comando).