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.