The snap try
command installs a snap from its unpackaged components within a directory. After installation, most changes to the components in that directory will immediately by visible in the installed snap.
Ordinarily, snaps cannot be modified. They are distributed as, and executed from, read-only SquashFS files whose integrity is guaranteed via assertions and the store.
But it’s sometimes useful to be able to experiment with a snap locally, to help debug an issue, or to make changes to a snap when you don’t have upstream access to the packaging process. This is when snap try
is useful.
In order to use snap try
, you first need to get the unpacked contents of the snap. The first step is to get the snap itself. The most practical source of snaps is the snap store, where a snap can be downloaded with the snap download
command:
$ snap download hello-world
Fetching snap "hello-world"
Fetching assertions for "hello-world"
Install the snap with:
snap ack hello-world_29.assert
snap install hello-world_29.snap
The download includes the snap itself and a signed set of assertions from the store to validate the snap’s default state.
Alternatively, .snap files for any installed snaps can be found at /var/lib/snapd/snaps/
, from where they can be copied across to your current working directory.
To uncompress the SquashFS .snap file, use unsquashfs <snap filename>
:
$ unsquashfs hello-world_29.snap
Parallel unsquashfs: Using 8 processors
6 inodes (6 blocks) to write
[===========================|] 6/6 100%
created 6 files
created 4 directories
created 0 symlinks
created 0 device
The files associated with the snap can now be found in the `squashfs-root’ directory. You can use snap try to install this unpacked snap.
Running snap try <directory>
installs an unpacked snap using a bind mount.
$ snap try squashfs-root
hello-world 6.4 mounted from /home/user/squashfs-root
$ which hello-world
/snap/bin/hello-world
Most changes now made to files in the squashfs-root
folder will be immediately reflected in the installed snap. This can be helpful when debugging an application within a snap, or the snap itself.
Certain changes, such as adjusting a snap’s interfaces or confinement will not be reflected in the installed snap until after a reinstall. These changes include:
Using the above hello-world snap, for example, we could edit the bin/echo
script to change its output without rebuilding or remounting the snap:
$ hello-world
Hello world!
$ sed -i 's/World/Everyone/g' /home/user/squashfs-root/bin/echo
$ hello-world
Hello Everyone!
When developing a snap with snapcraft, the snapcraft try
command can be used in combination with snap try
to quickly test a snap and fix issues.
The snapcraft try
command runs through the build process to the completion of the prime stage (see Parts lifecycle for further details). It then exposes the resultant prime directory to the snapcraft directory, even from within a virtual machine or container.
This prime directory includes all the staged components of a snap, which can then be installed and tested with the snap try <prime directory>
command.
The following, example, will build a hello-world snap within LXD and offer its prime directory locally:
$ snapcraft try --use-lxd
Pulling hello-world
+ snapcraftctl pull
Building hello-world
+ snapcraftctl build
+ cp --archive --link --no-dereference . /root/parts/hello-world/install
Staging hello-world
+ snapcraftctl stage
Priming hello-world
+ snapcraftctl prime
You can now run `snap try /home/user/hello-world/prime`.
The above snap can then be installed and tested with snap try
and the prime directory as its target:
$ snap try /home/user/hello-world/prime
hello-world 0.1 mounted from /home/user/hello-world/prime
For further help on testing and debugging a snap, see Iterating over a build and Debugging snaps.
Last updated 3 years ago.