У меня проблемы с отправкой вам документации, что означает, что я либо еще не выпил свой кофе (правда), либо нам не хватает какой-то документации ( обновление : часть документации здесь )
Когда вы объявляете приложения в своем snapcraft.yaml
, это приводит к тому, что двоичная оболочка генерируется после установки и помещается в нее /snap/bin/
, названная в честь вашего пакета и имени приложения (обратите внимание, что если приложение является службой, эта оболочка вместо этого представляет собой файл systemd .service).
Эта оболочка содержит большую часть среды, в которой будет работать приложение. Двумя переменными среды, которые наиболее актуальны для этого вопроса, являются SNAP_DATA
и SNAP_USER_DATA
.
SNAP_DATA
общесистемная область записи (в /var/snap/
). Это может быть использовано, например, для размещения журналов для сервисов.
SNAP_USER_DATA
специфичная для пользователя область записи в домашнем каталоге пользователя, запускающего приложение (в частности /home/<user>/snap/
). Это может быть использовано для пользовательских файлов конфигурации и т. Д.
Оба эти каталога очень важны для функциональности обновления / отката, так как оба они имеют версии . То есть каждая версия данной оснастки имеет свою копию этих каталогов. Позвольте мне объяснить на примере.
Допустим, вы устанавливаете версию 1 оснастки «foo». Это создаст две директории:
/var/snap/foo/1
( SNAP_DATA
)
/home/<user>/snap/foo/1
( SNAP_USER_DATA
)
Теперь скажите, что "foo" использует оба из них. Возможно, у него есть служба, в которой размещена база данных SNAP_DATA
, и двоичный файл, в котором используются файлы конфигурации SNAP_USER_DATA
.
Теперь выпущена версия 2 "foo", и она автоматически обновляется. Первое, что происходит, это то, что /var/snap/foo/1
копируется /var/snap/foo/2
и /home/<user>/snap/foo/1
копируется в /home/<user>/snap/foo/2
. Затем новая версия запускается. Он должен заметить, что он работает со старыми данными, и, возможно, у него есть некоторые миграции базы данных для запуска в базу данных SNAP_DATA
. Это делает это, и все уходит.
Теперь скажите, что по какой-либо причине эти миграции завершаются неудачно, и это приложение необходимо откатить. Он начинает использовать старую версию приложения / snap / foo, где SNAP_DATA
указывало /var/snap/foo/1
и SNAP_USER_DATA
указывало на /home/<user>/snap/foo/1
. Это подхватывает старую версию в момент до запуска миграций, так как эти операции выполнялись с копией данных.
Короче говоря: не используйте home
интерфейс для хранения данных, которые вы можете хранить SNAP_DATA
или SNAP_USER_DATA
, поскольку они являются неотъемлемой частью стратегии обновления / отката. Воспользуйтесь ими!
ОБНОВЛЕНИЕ для v2.0.10:
Также были введены два новых каталога данных:
SNAP_COMMON
сидит рядом SNAP_DATA
, но специально не версионно . Каждая ревизия определенной оснастки имеет доступ к этому каталогу, поэтому она не копируется при обновлении / откате и т. Д. Это может быть использовано для особенно больших неверсированных файлов (например, необработанных данных, которые на самом деле не зависят от версии).
SNAP_USER_COMMON
сидит рядом SNAP_USER_DATA
, но опять-таки специально не версированный . Может использоваться для хранения данных, не зависящих от версии, для каждого пользователя.
ОБНОВЛЕНИЕ для v2.15:
Файлы, размещенные внутри /snap/bin
, больше не являются оболочками, определяющими среду, а символическими ссылками /usr/bin/snap
. Таким образом, способ определения среды, в которой выполняется приложение, можно использовать snap run --shell <snap>.<app>
, например:
$ 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 не создается автоматически с помощью snapd? Сценарий запуска в/snap/bin/
не создает его, и создание его вручную в оснастке завершается неудачно (разрешение отклонено). Запускsnap run app
создает эту папку, хотя (но команда терпит неудачу сexecv failed: No such file or directory
... Я понятия не имею, как использовать эту команду).