Firecracker uses a Docker container to standardize the build process. This also fixes the build tools and dependencies to specific versions. Every once in a while, something needs to be updated. To do this, a new container image needs to be built locally, then published to the Docker registry. The Firecracker CI suite must also be updated to use the new image.
- A Docker account. You must create this by yourself on Docker hub.
- Access to the
fcuvm
Docker organization. - The
docker
package installed locally. You should already have this if you've ever built Firecracker from source. - Access to both an
x86_64
andaarch64
machines to build the container images.
-
Login to the Docker organization in a shell. Use your username and password (not
fcuvm
).docker login
-
Navigate to the Firecracker directory. Verify that you have the latest container image locally.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE fcuvm/dev v14 9bbc159ad600 2 months ago 2.31GB
-
Make your necessary changes, if any, to the Dockerfile(s). There's one for each supported architecture in the Firecracker source tree.
-
Commit the changes, if any.
-
Build a new container image with the updated Dockerfile.
docker build -t fcuvm/dev -f tools/devctr/Dockerfile.x86_64 .
-
Verify that the new image exists.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE fcuvm/dev latest 402b87586d11 5 minutes ago 2.31GB fcuvm/dev v14 9bbc159ad600 2 months ago 2.31GB
-
Tag the new image with the next available version and the architecture you're on.
docker tag 402b87586d11 fcuvm/dev:v15_x86_64 docker images REPOSITORY TAG IMAGE ID CREATED SIZE fcuvm/dev latest 402b87586d11 5 minutes ago 2.31GB fcuvm/dev v15_x86_64 402b87586d11 5 minutes ago 2.31GB fcuvm/dev v14 9bbc159ad600 2 months ago 2.31GB
-
Push the image.
docker push fcuvm/dev:v15_x86_64
Login to the aarch64
build machine.
Steps 1-4 are identical across architectures, change x86_64
to aarch64
.
Then:
-
Build a new container image with the updated Dockerfile.
docker build -t fcuvm/dev -f tools/devctr/Dockerfile.aarch64 .
-
Verify that the new image exists.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE fcuvm/dev latest 402b87586d11 5 minutes ago 2.31GB fcuvm/dev v14 c8581789ead3 2 months ago 2.31GB
-
Tag the new image with the next available version and the architecture you're on.
docker tag 402b87586d11 fcuvm/dev:v15_aarch64
docker images REPOSITORY TAG IMAGE ID CREATED SIZE fcuvm/dev latest 402b87586d11 5 minutes ago 2.31GB fcuvm/dev v15_aarch64 402b87586d11 5 minutes ago 2.31GB fcuvm/dev v14 c8581789ead3 2 months ago 2.31GB
-
Push the image.
docker push fcuvm/dev:v15_aarch64
-
Create a manifest to point the latest container version to each specialized image, per architecture.
docker manifest create fcuvm/dev:v15 fcuvm/dev:v15_x86_64 fcuvm/dev:v15_aarch64 docker manifest push fcuvm/dev:v15
-
Update the image tag in the
devtool
script. Commit and push the change.sed -i 's%DEVCTR_IMAGE="fcuvm/dev:v14"%DEVCTR_IMAGE="fcuvm/dev:v15"%' tools/devtool
Check out the
rust-vmm-container
readme
for additional troubleshooting steps and guidelines.
docker manifest is only supported when experimental cli features are enabled
See this article for explanations and fix.
Either fetch and run it locally on another machine than the one you used to build it, or clean up any artifacts from the build machine and fetch.
docker system prune -a
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tools/devtool shell
[Firecracker devtool] About to pull docker image fcuvm/dev:v15
[Firecracker devtool] Continue?
docker push fcuvm/dev:v15
The push refers to repository [docker.io/fcuvm/dev]
e2b5ee0c4e6b: Preparing
0fbb5fd5f156: Preparing
...
a1aa3da2a80a: Waiting
denied: requested access to the resource is denied
Only a Firecracker maintainer can update the container image. If you are one,
ask a member of the team to add you to the fcuvm
organization and retry.
Tags can be deleted from the Docker's repository WebUI.
Also, pushing the same tag twice will overwrite the initial content.
If you see unrelated Python
errors, it's likely because the dev container
pulls Python 3
at build time. Python 3
means different minor versions on
different platforms, and is not backwards compatible. So it's entirely possible
that docker build
has pulled in unwanted Python
dependencies.
To include only your changes, an alternative to the method described above
is to make the changes inside the container, instead of in the Dockerfile
.
Let's say you want to update
cargo-audit
(random example).
-
Enter the container as
root
.tools/devtool shell -p
-
Make the changes locally. Do not exit the container.
cargo install cargo-audit --force
-
Find your running container.
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e9f0487fdcb9 fcuvm/dev:v14 "bash" 53 seconds ago Up 52 seconds zen_beaver
-
Commit the modified container to a new image. Use the
container ID
.docker commit e9f0487fdcb9 fcuvm/dev:v15_x86_64
docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE fcuvm/dev v15_x86_64 514581e654a6 18 seconds ago 2.31GB fcuvm/dev v14 c8581789ead3 2 months ago 2.31GB
-
Repeat for
aarch64
. -
Create and push the manifest.