Install slices in a rock

In this tutorial, you will create a lean hello-world rock that uses chisel slices, and then compare the resulting rock with the one created without slices in Create a “Hello World” rock.

Setup your environment

We recommend starting from a clean Ubuntu 22.04 installation. If you don’t have one available, you can create one using Multipass:

How to create an Ubuntu 22.04 VM with Multipass

Is Multipass already installed and active? Check by running

sudo snap services multipass

If you see the multipass service but it isn’t “active”, then you’ll need to run sudo snap start multipass. On the other hand, if you get an error saying snap "multipass" not found, then you must install Multipass:

sudo snap install multipass

Then you can create the VM with the following command:

multipass launch --disk 10G --name rock-dev 22.04

Finally, once the VM is up, open a shell into it:

multipass shell rock-dev

LXD will be required for building the rock. Make sure it is installed and initialised:

sudo snap install lxd
lxd init --auto

In order to create the rock, you’ll need to install Rockcraft:

sudo snap install rockcraft --classic

We’ll use Docker to run the rock. You can install it as a snap:

sudo snap install docker

Warning

There is a known connectivity issue with LXD and Docker. If you see a networking issue such as “A network related operation failed in a context of no network access”, make sure you apply one of the fixes suggested here.

Note that you’ll also need a text editor. You can either install one of your choice or simply use one of the already existing editors in your Ubuntu environment (like vi).

Project setup

Create a new directory, write the following into a text editor and save it as rockcraft.yaml:

name: chiselled-hello
summary: Hello world from Chisel slices
description: A "bare" rock containing the "hello" package binaries from Chisel slices.
license: Apache-2.0

version: "latest"
base: bare
build_base: "[email protected]"
platforms:
  amd64:

parts:
  hello:
    plugin: nil
    stage-packages:
      - hello_bins

Note that this Rockcraft file uses the hello_bins Chisel slice to generate an image containing only files that are strictly necessary for the hello binary. See Chisel for details on the Chisel tool.

Pack the rock with Rockcraft

To build the rock, run:

rockcraft pack

The output will look similar to:

Launching instance...
Retrieved base bare for amd64
Extracted bare:latest
Executed: pull hello
Executed: overlay hello
Executed: build hello
Executed: stage hello
Executed: prime hello
Executed parts lifecycle
Exported to OCI archive 'chiselled-hello_latest_amd64.rock'

The process might take a little while, but at the end, a new file named chiselled-hello_latest_amd64.rock will be present in the current directory. That’s your chiselled-hello rock, in oci-archive format.

Run the rock in Docker

First, import the recently created rock into Docker:

sudo rockcraft.skopeo --insecure-policy copy oci-archive:chiselled-hello_latest_amd64.rock docker-daemon:chiselled-hello:latest

Now you can run a container from the rock:

docker run --rm chiselled-hello:latest exec hello -t

Which should print:

hello, world

The chiselled-hello image will have a size of 5.6 MB, which is much less in size than the 8.8 MB hello rock created in Create a “Hello World” rock.