How to get a Baserock build system running in Docker
If you just want a Baserock container in docker, try
docker pull baserock/14.29
Docker is a tool that provides containerisation of systems. Baserock produces systems that are suitable for running in containers. It is a match made in heaven!
Running a Baserock build system chroot in a Docker container is an alternative to using the schroot-based baserock-chroot tooling. So far the schroot-based tooling is more widely used than Docker, so you may be less likely to encounter issues with it.
Importing a Baserock chroot tarball as a Docker image
To import a Baserock chroot tarball into Docker as an image, you can do the following:
TARBALL=http://download.baserock.org/baserock/baserock-current-build-system-x86_64-chroot.tar.gz
curl --get $TARBALL | docker import - baserock-build-x86_64:15.25
Replace '15.25' with the current version number of Baserock.
The Baserock build system image should then show up in docker images
:
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
baserock-build-x86_64 15.25 6129ad923746 3 minutes ago 1.294 GB
Running Morph commands in a Docker container
Docker's usual model is that you run a single server process in each container.
However, you can start an interactive session using the --interactive
and
--tty
flags:
docker run --name=br --interactive --privileged --tty \
--volume=$HOME/baserock-src:/src \
baserock-build-x86_64:14.29 /bin/bash
The --privileged
flag is required for two reasons. Firstly, building with
Morph requires making bind-mounts, due to the use of linux-user-chroot.
Secondly, assembling the fhs-dirs chunk artifacts requires creating device
nodes. Both of these are considered privileged operations by Docker and are
prevented by default.
Note that we bind-mount in the /src directory as a volume. You should change
$HOME/baserock-src
in the above example to whatever path you want to use to
hold source code and build artifacts). Storing data directly inside a Docker
container's filesystem is discouraged. Anything important should be on the host
(or a dedicated storage system) instead and should be shared with the container
as a volume.
When you exit this shell, the container will be stopped. However, it's not deleted.
You can find it in the output of docker ps -a
:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d00360aaac6 baserock-build-x86_64:14.29 /bin/bash 5 minutes ago Exited (0) 4 minutes ago br
You can continue with it where you left off using docker start --interactive
:
docker start --interactive br
Docker things to try
You could tag your image and push it to the docker registry, for example
$ docker tag 6129ad923746 <yourname>/baserock-build-x86_64:14.29
$ docker push <yourname>/baserock-build-x86_64
Caveats
The Morph test suite fails in Baserock 14.29 inside Docker right now. This seems to be due to use of the following construct in the Yarn tests:
install -m644 -D /dev/stdin << EOF target_file
<content>
EOF
Docker attaches to the container's /dev/stdin which seems to prevent the above construct from working correctly.
Some Morph operations require Btrfs, such as deploying to rawdisk
. You may
need to manually modprobe btrfs
on the host for this to work.