Estou tendo problemas para encaminhá-lo para a documentação, o que significa que ainda não tomei meu café (verdadeiro) ou estamos perdendo alguma documentação ( atualização : alguma documentação aqui )
Quando você declara aplicativos no seu snapcraft.yaml
, isso resulta em um invólucro binário sendo gerado na instalação e colocado no /snap/bin/
nome do pacote e nome do aplicativo (observe que, se o aplicativo for um serviço, esse invólucro será um arquivo systemd .service).
Esse wrapper contém a maior parte do ambiente sob o qual o aplicativo será executado. As duas variáveis de ambiente mais relevantes para esta questão são SNAP_DATA
e SNAP_USER_DATA
.
SNAP_DATA
é uma área gravável em todo o sistema (pol /var/snap/
). Isso pode ser usado para hospedar logs de serviços, por exemplo.
SNAP_USER_DATA
é uma área gravável específica do usuário no diretório inicial do usuário que está executando o aplicativo (especificamente /home/<user>/snap/
). Isso pode ser usado para arquivos de configuração específicos do usuário, etc.
Ambos os diretórios são muito importantes para a funcionalidade de atualização / reversão, pois os dois são versionados . Ou seja, cada versão de um determinado snap possui sua própria cópia desses diretórios. Deixe-me explicar com um exemplo.
Digamos que você instale a versão 1 do snap "foo". Isso criará dois diretórios:
/var/snap/foo/1
( SNAP_DATA
)
/home/<user>/snap/foo/1
( SNAP_USER_DATA
)
Agora diga "foo" usa os dois. Talvez ele tenha um serviço que hospeda um banco de dados SNAP_DATA
e um binário que usa arquivos de configuração SNAP_USER_DATA
.
Agora a versão 2 do "foo" é lançada e atualizada automaticamente. A primeira coisa que acontece é que /var/snap/foo/1
é copiado /var/snap/foo/2
e /home/<user>/snap/foo/1
copiado /home/<user>/snap/foo/2
. Em seguida, a nova versão é acionada. Observe que está sendo executado em dados antigos e talvez tenha algumas migrações de banco de dados para executar no banco de dados SNAP_DATA
. Faz isso, e vai embora.
Agora diga que essas migrações falham por qualquer motivo, e esse aplicativo precisa ser revertido. Ele começa a usar a versão antiga do aplicativo / snap / foo, onde SNAP_DATA
estava apontando /var/snap/foo/1
e SNAP_USER_DATA
apontando /home/<user>/snap/foo/1
. Isso acompanha a versão antiga no momento anterior à execução das migrações, pois essas operações foram executadas em uma cópia dos dados.
Para encurtar a história: não use a home
interface para armazenar dados que você pode armazenar SNAP_DATA
ou SNAP_USER_DATA
, pois eles são parte integrante da estratégia de atualização / reversão. Aproveite-os!
ATUALIZAÇÃO para v2.0.10:
Dois novos diretórios de dados também foram introduzidos:
SNAP_COMMON
fica ao lado SNAP_DATA
, mas é especificamente não versionado . Toda revisão do snap específico tem acesso a esse diretório, portanto ele não é copiado na atualização / reversão, etc. Isso pode ser usado para arquivos particularmente grandes e não versionados (por exemplo, dados brutos que não são realmente específicos da versão).
SNAP_USER_COMMON
fica ao lado SNAP_USER_DATA
, mas é novamente especificamente não versionado . Pode ser usado para armazenar dados não específicos da versão por usuário.
ATUALIZAÇÃO para v2.15:
Os arquivos colocados dentro /snap/bin
não são mais wrappers que definem o ambiente, mas links simbólicos para /usr/bin/snap
. Portanto, a maneira de determinar o ambiente em que um aplicativo é executado seria usar snap run --shell <snap>.<app>
, por exemplo:
$ 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 não está sendo criado automaticamente pelo snapd? O script do iniciador/snap/bin/
não o cria e a criação manual dentro do snap falha (permissão negada). A execuçãosnap run app
cria essa pasta, no entanto (mas o comando falha comexecv failed: No such file or directory
... eu não tenho idéia de como usar esse comando).snap run
é usado).