Manage containers with the Toit SDK

In this tutorial we will create a container and bundle it with a firmware envelope. We will then flash the envelope to a device.

Prerequisites

This tutorial requires the Toit SDK. It can be installed on Archlinux with yay -S toit (in which case the SDK can be found in /opt/toit-sdk). Alternatively, the SDK can be downloaded from the Toit releases page, or build from source. When building locally, the SDK is located at build/host/sdk.

This tutorial assumes that Toit's firmware tool is available as firmware. This tool can be found in the SDK at $SDK/tools/firmware.

It also assumes that a Toit firmware envelope is available as firmware.envelope. In a local build it is located at build/esp32/firmware.envelope. Each Toit release also has a corresponding firmware envelope available for download (for example firmware-esp32.gz).

Finally, it assumes that the Toit compiler is available as toit.compile. This tool can be found in the SDK at $SDK/bin/toit.compile.

Instructions

Start by building a snapshot of the program you want to install.

Then add the snapshot to a firmware envelope.

The created envelope can be flashed to a device using the flash command.

When the device boots up, it will run the installed container.

If you want to install the container, but not run it at boot, you can use the --trigger none flag when installing the container. You will then need to start the container manually.

Library

The system.containers library provides a way to list, and start containers.

Listing containers

Here is an example of how to list the installed containers.

You can also run this program with Jaguar. In that case you should see the "Jaguar" container, and then an unnamed container. The unnamed container is this program that is temporarily installed when calling jag run or jag watch.

Also note that Jaguar doesn't set names when installing containers.

Starting containers

As a next step we can start other containers with start.

Here we start all containers except the Jaguar container, and the container that is currently running. We then wait for the container to exit, and print the exit status.