Containerise a PyPI package¶
By the end of this tutorial you will be able to run pyfiglet via docker:
$ docker run --rm -it pyfiglet:0.7.6 exec pyfiglet hello
_ _ _
| |__ ___| | | ___
| '_ \ / _ \ | |/ _ \
| | | | __/ | | (_) |
|_| |_|\___|_|_|\___/
Setup your environment¶
We recommend starting from a clean Ubuntu installation. If we don’t have one available, we can create one using Multipass:
Is Multipass already installed and active? Check by running
snap services multipass
If we see the multipass
service but it isn’t “active”, then we’ll
need to run sudo snap start multipass
. On the other hand, if we get
an error saying snap "multipass" not found
, then we must install
Multipass:
sudo snap install multipass
See Multipass installation instructions, switch to Windows in the drop down.
See Multipass installation instructions, switch to macOS in the drop down.
Then we can create the VM with the following command:
multipass launch --disk 10G --name rock-dev 24.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, we’ll need to install Rockcraft:
sudo snap install rockcraft --classic
We’ll use Docker to run the rock. We can install it as a snap
:
sudo snap install docker
By default, Docker is only accessible with root privileges (sudo
). We want
to be able to use Docker commands as a regular user:
sudo addgroup --system docker
sudo adduser $USER docker
newgrp docker
sudo snap disable docker
sudo snap enable docker
Warning
There is a known connectivity issue with LXD and Docker. If we see a networking issue such as “A network related operation failed in a context of no network access”, make sure to apply one of the suggested fixes here.
Note that we’ll also need a text editor. We can either install one of our
choice or simply use one of the already existing editors in the Ubuntu
environment (like vi
).
Project setup¶
To create a new Rockcraft project, create a new directory and change into it:
mkdir pyfiglet-rock && cd pyfiglet-rock
Next, create a file called rockcraft.yaml
with the following contents:
name: pyfiglet
base: [email protected]
version: '0.7.6' # Note: should match `pyfiglet` below
summary: A rock for pyfiglet
description: A rock for pyfiglet
license: Apache-2.0
platforms:
amd64:
parts:
pyfiglet:
plugin: python
source: .
python-packages:
- pyfiglet==0.7.6 # Note: should match `version` above
stage-packages:
- python3-venv
Pack the rock with Rockcraft¶
To build the rock, run:
rockcraft pack
Run the rock in Docker¶
First, import the recently created rock into Docker:
sudo rockcraft.skopeo --insecure-policy copy oci-archive:pyfiglet_0.7.6_amd64.rock docker-daemon:pyfiglet:0.7.6
Now run the pyfiglet
command from the rock:
docker run --rm pyfiglet:0.7.6 exec pyfiglet it works!
Which should print:
_ _ _ _
(_) |_ __ _____ _ __| | _____| |
| | __| \ \ /\ / / _ \| '__| |/ / __| |
| | |_ \ V V / (_) | | | <\__ \_|
|_|\__| \_/\_/ \___/|_| |_|\_\___(_)
Explore the running container¶
Since the rock uses an ubuntu base, you can poke around in a running container using bash, via:
$ docker run --rm -it pyfiglet:0.7.6 exec bash
root@14d1812a2681:/# pyfiglet hi
_ _
| |__ (_)
| '_ \| |
| | | | |
|_| |_|_|