From 23233851db544836430373385fc031a01032fd56 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Tue, 3 Feb 2015 10:46:34 +0000 Subject: [PATCH 01/13] Support non-containerized WEAVETOOLS_EXES build --- .gitignore | 1 + Makefile | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/.gitignore b/.gitignore index 46a83f2c..c1df85ea 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,5 @@ _testmain.go weaver/weaver weavedns/weavedns tools/bin +tools/build releases diff --git a/Makefile b/Makefile index cfe33ff8..1d492d64 100644 --- a/Makefile +++ b/Makefile @@ -38,8 +38,17 @@ $(WEAVER_EXE) $(WEAVEDNS_EXE): common/*.go $(WEAVER_EXE): router/*.go weaver/main.go $(WEAVEDNS_EXE): nameserver/*.go weavedns/main.go +build_weavetools_exes_in_container=yes + $(WEAVETOOLS_EXES): tools/build.sh +ifdef build_weavetools_exes_in_container $(SUDO) docker run --rm -v $(realpath $( Date: Tue, 3 Feb 2015 12:36:39 +0000 Subject: [PATCH 02/13] Add 'build' makefile target --- Makefile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1d492d64..8a15e798 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ PUBLISH=publish_weave publish_weavedns publish_weavetools .DEFAULT: all -.PHONY: all update tests publish $(PUBLISH) clean +.PHONY: all update tests publish $(PUBLISH) clean prerequisites build # If you can use docker without being root, you can do "make SUDO=" SUDO=sudo @@ -78,3 +78,12 @@ clean: -$(SUDO) docker rmi $(WEAVER_IMAGE) $(WEAVEDNS_IMAGE) $(WEAVETOOLS_IMAGE) rm -f $(WEAVER_EXE) $(WEAVEDNS_EXE) $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT) $(WEAVETOOLS_EXPORT) $(SUDO) rm -rf $(WEAVETOOLS_EXES) + +prerequisites: + $(SUDO) apt-get -y update + $(SUDO) apt-get -y install --no-install-recommends build-essential git ca-certificates golang docker.io mercurial libpcap-dev + +build: prerequisites + $(SUDO) go clean -i net + $(SUDO) go install -tags netgo std + $(MAKE) build_weavetools_exes_in_container= From 3c093d7534fc4cd13b8c83fecd62ce00a34e99c6 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Tue, 3 Feb 2015 12:38:15 +0000 Subject: [PATCH 03/13] Make build.sh show its progress --- tools/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build.sh b/tools/build.sh index f8919653..c1d51517 100644 --- a/tools/build.sh +++ b/tools/build.sh @@ -1,5 +1,5 @@ #!/bin/sh -set -e +set -x -e apt-get -y update apt-get -y install curl make pkg-config gcc bison flex From 949afd9c20e90a06a0f4bd10bd1340691b5b533b Mon Sep 17 00:00:00 2001 From: David Wragg Date: Tue, 10 Feb 2015 13:51:59 +0000 Subject: [PATCH 04/13] Add some sudos to make tools/build.sh work when not root --- tools/build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/build.sh b/tools/build.sh index c1d51517..2bfd2e0f 100644 --- a/tools/build.sh +++ b/tools/build.sh @@ -1,8 +1,8 @@ #!/bin/sh set -x -e -apt-get -y update -apt-get -y install curl make pkg-config gcc bison flex +sudo apt-get -y update +sudo apt-get -y install curl make pkg-config gcc bison flex BASEDIR=$(dirname $0) mkdir -p "$BASEDIR"/bin @@ -38,7 +38,7 @@ fetch() { for PACKAGE in $PACKAGES; do fetch $PACKAGE - (cd $PACKAGE; ./configure --disable-shared && make install) + (cd $PACKAGE; ./configure --disable-shared && make && sudo make install) done fetch $CONNTRACK From b1ac63cae6bb20423048f573601fb22c51ae1c97 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Wed, 4 Feb 2015 11:20:36 +0000 Subject: [PATCH 05/13] A Dockerfile to facilitate building in a container --- build/Dockerfile | 6 ++++++ build/build.sh | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 build/Dockerfile create mode 100644 build/build.sh diff --git a/build/Dockerfile b/build/Dockerfile new file mode 100644 index 00000000..74904563 --- /dev/null +++ b/build/Dockerfile @@ -0,0 +1,6 @@ +FROM ubuntu +# After installing the prerequisite we clear out sources.list so that +# 'apt-get update' doesn't do anything. +RUN sh -c 'apt-get -y update && apt-get -y install --no-install-recommends build-essential git ca-certificates golang docker.io mercurial libpcap-dev curl make pkg-config gcc bison flex && echo >/etc/apt/sources.list' +COPY build.sh / +ENTRYPOINT ["sh", "/build.sh"] diff --git a/build/build.sh b/build/build.sh new file mode 100644 index 00000000..68523397 --- /dev/null +++ b/build/build.sh @@ -0,0 +1,44 @@ +#!/bin/sh +set -e + +GOPATH=/home/go +export GOPATH + +WEAVE_SRC=$GOPATH/src/github.com/zettio/weave + +if [ $# -eq 0 ] ; then + # No arguments. Expect that the weave repo will be bind-mounted + # into $GOPATH + if ! [ -e $WEAVE_SRC ] ; then + cat 2>&1 <:${GOPATH} \\ + -v /var/run/docker.sock:/var/run/docker.sock zettio/weave-build + +Or supply git clone arguments to retrieve it, e.g.: + + $ docker run -v /var/run/docker.sock:/var/run/docker.sock \\ + zettio/weave-build https://github.com/zettio/weave.git +EOF + exit 1 + fi + + # If we run make directly, any files created on the bind mount + # will have awkward ownership. So we switch to a user with the + # same user and group IDs as source directory. We have to set a + # few things up so that sudo works without complaining later on. + uid=$(stat --format="%u" $WEAVE_SRC) + gid=$(stat --format="%g" $WEAVE_SRC) + echo "weave:x:$uid:$gid::$WEAVE_SRC:/bin/sh" >>/etc/passwd + echo "weave:*:::::::" >>/etc/shadow + echo "weave ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers + su weave -c "make -C $WEAVE_SRC build" +else + # There are arguments to pass to git-clone + mkdir -p ${WEAVE_SRC%/*} + git clone "$@" $WEAVE_SRC + make -C $WEAVE_SRC build +fi From cd06a29d6c23f77b893d02533614748f02944b2b Mon Sep 17 00:00:00 2001 From: David Wragg Date: Wed, 4 Feb 2015 11:26:37 +0000 Subject: [PATCH 06/13] Update build docs I'm not sure about using the name 'zettio/weave-build' for the image here. There's no intent to upload it to dockerhub, so including the user name 'zettio' seems wrong. On the other hand, I'm not sure what the meaning of an unslashed image name is supposed to be. Probably it doesn't matter what a private non-pushed image is called, as long as it doesn't clash with something. --- site/building.md | 97 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 82 insertions(+), 15 deletions(-) diff --git a/site/building.md b/site/building.md index 0a6cb980..75eda272 100644 --- a/site/building.md +++ b/site/building.md @@ -3,35 +3,102 @@ title: Building Weave layout: default --- -**NB** This is only necessary if you want to work on the weave code. +You only need to build weave if you want to work on the weave codebase +(or you just enjoy building software). -## Building directly on Linux +Apart from the `weave` shell script, weave is delivered as a set of +container images. There is no distribution-specific packaging, so in +principle it shouldn't matter which Linux distribution you build +under. But naturally, Docker is a prerequisite (version 1.3.0 or +later). And it is difficult to build under Fedora because [Fedora +does not include static +libraries](http://fedoraproject.org/wiki/Packaging:Guidelines#Packaging_Static_Libraries). +So we recommend building under Ubuntu. -You can work on weave without using a VM if you are running the docker -daemon outside a VM. (These instructions have only been tested on -Ubuntu.) +You can also build in a container under any system that supports +Docker. And naturally, you can run Ubuntu in a VM and build +there. These options are described below. -To build weave you need `libpcap-dev` and `docker` (version 1.3.0 or -later) installed. And `go` (and `git` and `hg` to fetch dependencies). +## Building directly on Ubuntu -The package name is `github.com/zettio/weave`, so assuming `$GOPATH` -is set: +The weave git repository should be cloned into +`$GOPATH/src/github.com/zettio/weave`, in accordance with (the go +workspace conventions)[https://golang.org/doc/code.html#Workspaces]: ```bash -$ cd $GOPATH $ WEAVE=github.com/zettio/weave -$ git clone https://$WEAVE src/$WEAVE -$ cd src/$WEAVE +$ git clone https://$WEAVE $GOPATH/src/$WEAVE +$ cd $GOPATH/src/$WEAVE ``` -Then simply run +Several prerequisites are needed to build weave. To install these, in +the weave directory do: + +```bash +$ make prerequisites +``` + +Then to actually build, simply do: ```bash $ make ``` -This will build the weave router, produce a docker image -`zettio/weave` and export that image to `/var/tmp/weave.tar`. +This will build the weave components and package them into three +Docker images (`zettio/weave`, `zettio/weavedns`, and +`zettio/weavetools`). These are then exported (as +`/var/tmp/weave.tar`, `weavends.tar` and `weavetools.tar`). + +## Building in a Docker container + +As a preliminary step, we create a container image based on Ubuntu +that has all the prerequisites. This avoids the need to download and +install them for each build. In the `weave` directory, do: + +```bash +$ docker build -t zettio/weave-build build +``` + +Then to actually build, do: + +```bash +$ docker run -v /var/run/docker.sock:/var/run/docker.sock zettio/weave-build https://github.com/zettio/weave.git +``` + +This will clone the weave git repository, then do the build. + +Note the `-v` option to give the container access to the Docker daemon +on the host. When the build completes, the resulting images are +stored in docker on the host, as when building directly under +Ubuntu. The exported images are present under `/var/tmp/` inside the +container, and can be retrieved using `docker cp` if needed. + +If you are building under a Fedora or RHEL Docker host (or another +distribution that uses SELinux), and you have SELinux set to enforcing +mode, it will block attempts to access `/var/run/docker.sock` inside +the container. See +[dpw/selinux-dockersock](https://github.com/dpw/selinux-dockersock) +for a way to work around this problem. + +The container arguments are passed to `git clone`, so for example, you +can build from a forked repository and a specific branch with: + +```bash +$ docker run -v /var/run/docker.sock:/var/run/docker.sock zettio/weave-build -b +``` + +Alternatively, you might want to build from a weave source tree +already present on the host. You can do this by using the `-v` option +to bind the bind your go workspace containing the weave repository to +`/home/go` inside the container. No container arguments should be +passed in this case: + +```bash +$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v :/home/go zettio/weave-build +``` + +This will leave the intermediate build artifacts on the host, so that +you can modify the weave source code and rebuild quickly. ## Building using Vagrant From 4ea67bbab9c7c37ce84eb9be1e17391d6a632ab5 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Thu, 19 Feb 2015 12:50:40 +0000 Subject: [PATCH 07/13] Elaborate comments --- build/Dockerfile | 10 ++++++++-- tools/build.sh | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index 74904563..46b584bc 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,6 +1,12 @@ FROM ubuntu -# After installing the prerequisite we clear out sources.list so that -# 'apt-get update' doesn't do anything. + +# When doing a build in a container, "apt-get update" happens twice, +# which can be a very significant overhead for incremental builds. +# And it's unnecessary, because if any of the prerequisites do change, +# the right thing to do is to rebuild the container image. Rather +# than suppressing the "apt-get update" commands explicitly, we clear +# out sources.list so that 'apt-get update' doesn't do anything. + RUN sh -c 'apt-get -y update && apt-get -y install --no-install-recommends build-essential git ca-certificates golang docker.io mercurial libpcap-dev curl make pkg-config gcc bison flex && echo >/etc/apt/sources.list' COPY build.sh / ENTRYPOINT ["sh", "/build.sh"] diff --git a/tools/build.sh b/tools/build.sh index 2bfd2e0f..87528a09 100644 --- a/tools/build.sh +++ b/tools/build.sh @@ -1,4 +1,6 @@ #!/bin/sh + +# Show the progress of this script, in case it fails. set -x -e sudo apt-get -y update From d23df19997172310b5eb58a0b3a1961c017a87e0 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Tue, 24 Feb 2015 11:56:34 +0000 Subject: [PATCH 08/13] reword --- site/building.md | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/site/building.md b/site/building.md index 75eda272..cc3ad3bc 100644 --- a/site/building.md +++ b/site/building.md @@ -16,8 +16,8 @@ libraries](http://fedoraproject.org/wiki/Packaging:Guidelines#Packaging_Static_L So we recommend building under Ubuntu. You can also build in a container under any system that supports -Docker. And naturally, you can run Ubuntu in a VM and build -there. These options are described below. +Docker. And you can run Ubuntu in a VM and build there. These +options are described below. ## Building directly on Ubuntu @@ -59,7 +59,16 @@ install them for each build. In the `weave` directory, do: $ docker build -t zettio/weave-build build ``` -Then to actually build, do: +Next we run a container based on that image. That container requires +access to the Docker daemon on the host, via +`/var/run/docker.sock`. If you are building under a Fedora or RHEL +Docker host (or another distribution that uses SELinux), and you have +SELinux set to enforcing mode, it will block attempts to access +`/var/run/docker.sock` inside the container. See +[dpw/selinux-dockersock](https://github.com/dpw/selinux-dockersock) +for a way to work around this problem. + +To perform a build, run: ```bash $ docker run -v /var/run/docker.sock:/var/run/docker.sock zettio/weave-build https://github.com/zettio/weave.git @@ -67,18 +76,10 @@ $ docker run -v /var/run/docker.sock:/var/run/docker.sock zettio/weave-build htt This will clone the weave git repository, then do the build. -Note the `-v` option to give the container access to the Docker daemon -on the host. When the build completes, the resulting images are -stored in docker on the host, as when building directly under -Ubuntu. The exported images are present under `/var/tmp/` inside the -container, and can be retrieved using `docker cp` if needed. - -If you are building under a Fedora or RHEL Docker host (or another -distribution that uses SELinux), and you have SELinux set to enforcing -mode, it will block attempts to access `/var/run/docker.sock` inside -the container. See -[dpw/selinux-dockersock](https://github.com/dpw/selinux-dockersock) -for a way to work around this problem. +When the build completes, the resulting images are stored in docker on +the host, as when building directly under Ubuntu. The exported images +are present under `/var/tmp/` inside the container, and can be +retrieved using `docker cp` if needed. The container arguments are passed to `git clone`, so for example, you can build from a forked repository and a specific branch with: From 438e57853b1fdf564cbbcedcfeb4fc5afb3ca687 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Tue, 24 Feb 2015 14:38:07 +0000 Subject: [PATCH 09/13] Leave the docker image .tar files in the weave directory Making things into /var/tmp is a bit odd, and this works better in the context of the containerized build. --- .gitignore | 3 +++ Makefile | 6 +++--- site/building.md | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index c1df85ea..429197cc 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,6 @@ weavedns/weavedns tools/bin tools/build releases +weave.tar +weavedns.tar +weavetools.tar diff --git a/Makefile b/Makefile index 8a15e798..48452279 100644 --- a/Makefile +++ b/Makefile @@ -14,9 +14,9 @@ WEAVETOOLS_EXES=tools/bin WEAVER_IMAGE=$(DOCKERHUB_USER)/weave WEAVEDNS_IMAGE=$(DOCKERHUB_USER)/weavedns WEAVETOOLS_IMAGE=$(DOCKERHUB_USER)/weavetools -WEAVER_EXPORT=/var/tmp/weave.tar -WEAVEDNS_EXPORT=/var/tmp/weavedns.tar -WEAVETOOLS_EXPORT=/var/tmp/weavetools.tar +WEAVER_EXPORT=weave.tar +WEAVEDNS_EXPORT=weavedns.tar +WEAVETOOLS_EXPORT=weavetools.tar all: $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT) $(WEAVETOOLS_EXPORT) diff --git a/site/building.md b/site/building.md index cc3ad3bc..01b1c85a 100644 --- a/site/building.md +++ b/site/building.md @@ -47,7 +47,7 @@ $ make This will build the weave components and package them into three Docker images (`zettio/weave`, `zettio/weavedns`, and `zettio/weavetools`). These are then exported (as -`/var/tmp/weave.tar`, `weavends.tar` and `weavetools.tar`). +`weave.tar`, `weavends.tar` and `weavetools.tar`). ## Building in a Docker container From cf2b7bc673132e809d3fa29934a7a495d0a53c23 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Wed, 25 Feb 2015 14:15:07 +0000 Subject: [PATCH 10/13] Remove 'make prerequisites' and update docs accordingly --- Makefile | 6 +----- site/building.md | 10 +++++++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 48452279..511d94bf 100644 --- a/Makefile +++ b/Makefile @@ -79,11 +79,7 @@ clean: rm -f $(WEAVER_EXE) $(WEAVEDNS_EXE) $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT) $(WEAVETOOLS_EXPORT) $(SUDO) rm -rf $(WEAVETOOLS_EXES) -prerequisites: - $(SUDO) apt-get -y update - $(SUDO) apt-get -y install --no-install-recommends build-essential git ca-certificates golang docker.io mercurial libpcap-dev - -build: prerequisites +build: $(SUDO) go clean -i net $(SUDO) go install -tags netgo std $(MAKE) build_weavetools_exes_in_container= diff --git a/site/building.md b/site/building.md index 01b1c85a..20f3bffb 100644 --- a/site/building.md +++ b/site/building.md @@ -31,11 +31,15 @@ $ git clone https://$WEAVE $GOPATH/src/$WEAVE $ cd $GOPATH/src/$WEAVE ``` -Several prerequisites are needed to build weave. To install these, in -the weave directory do: +Some prerequisites are needed to build weave. First, install Docker +if you haven't already, by following the instructions (on the Docker +site)[https://docs.docker.com/installation/ubuntulinux/]. Note that +we recommend using the Docker-maintained `lxc-docker` package, rather +than the `docker.io` package which contains a very old version. Then +install the other prerequisites for building with: ```bash -$ make prerequisites +$ sudo apt-get install build-essential git golang mercurial libpcap-dev ``` Then to actually build, simply do: From a869e89c7b52c2f5d76a297bd2e10b84c2b55e6a Mon Sep 17 00:00:00 2001 From: David Wragg Date: Wed, 25 Feb 2015 14:20:49 +0000 Subject: [PATCH 11/13] Fix incorrect markdown link syntax --- site/building.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/site/building.md b/site/building.md index 20f3bffb..d9429778 100644 --- a/site/building.md +++ b/site/building.md @@ -22,8 +22,8 @@ options are described below. ## Building directly on Ubuntu The weave git repository should be cloned into -`$GOPATH/src/github.com/zettio/weave`, in accordance with (the go -workspace conventions)[https://golang.org/doc/code.html#Workspaces]: +`$GOPATH/src/github.com/zettio/weave`, in accordance with [the go +workspace conventions](https://golang.org/doc/code.html#Workspaces): ```bash $ WEAVE=github.com/zettio/weave @@ -32,8 +32,8 @@ $ cd $GOPATH/src/$WEAVE ``` Some prerequisites are needed to build weave. First, install Docker -if you haven't already, by following the instructions (on the Docker -site)[https://docs.docker.com/installation/ubuntulinux/]. Note that +if you haven't already, by following the instructions [on the Docker +site](https://docs.docker.com/installation/ubuntulinux/). Note that we recommend using the Docker-maintained `lxc-docker` package, rather than the `docker.io` package which contains a very old version. Then install the other prerequisites for building with: From 3d5e76d0e82161372770cf2091e1dcbff5cbbe11 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Wed, 25 Feb 2015 14:29:48 +0000 Subject: [PATCH 12/13] Always use sudo for docker commands in instructions --- site/building.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/site/building.md b/site/building.md index d9429778..c2a73e6c 100644 --- a/site/building.md +++ b/site/building.md @@ -60,7 +60,7 @@ that has all the prerequisites. This avoids the need to download and install them for each build. In the `weave` directory, do: ```bash -$ docker build -t zettio/weave-build build +$ sudo docker build -t zettio/weave-build build ``` Next we run a container based on that image. That container requires @@ -75,7 +75,7 @@ for a way to work around this problem. To perform a build, run: ```bash -$ docker run -v /var/run/docker.sock:/var/run/docker.sock zettio/weave-build https://github.com/zettio/weave.git +$ sudo docker run -v /var/run/docker.sock:/var/run/docker.sock zettio/weave-build https://github.com/zettio/weave.git ``` This will clone the weave git repository, then do the build. @@ -89,7 +89,7 @@ The container arguments are passed to `git clone`, so for example, you can build from a forked repository and a specific branch with: ```bash -$ docker run -v /var/run/docker.sock:/var/run/docker.sock zettio/weave-build -b +$ sudo docker run -v /var/run/docker.sock:/var/run/docker.sock zettio/weave-build -b ``` Alternatively, you might want to build from a weave source tree @@ -99,7 +99,7 @@ to bind the bind your go workspace containing the weave repository to passed in this case: ```bash -$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v :/home/go zettio/weave-build +$ sudo docker run -v /var/run/docker.sock:/var/run/docker.sock -v :/home/go zettio/weave-build ``` This will leave the intermediate build artifacts on the host, so that @@ -154,7 +154,7 @@ The docker daemon is also running in this VM, so you can then do ```bash vm$ sudo ./weave launch -vm$ docker ps +vm$ sudo docker ps ``` and so on. From f46746c75f8124fb9bbf5f31d7adf90412008155 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Wed, 25 Feb 2015 15:08:26 +0000 Subject: [PATCH 13/13] Fix a mention of the exported images being in /var/tmp In fact, remove the mention of the exported images being in the container altogether. The images are in the host docker daemon, so it is easier to export them again than to go fishing around with 'docker cp'. --- site/building.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/site/building.md b/site/building.md index c2a73e6c..7d61a8e4 100644 --- a/site/building.md +++ b/site/building.md @@ -81,9 +81,7 @@ $ sudo docker run -v /var/run/docker.sock:/var/run/docker.sock zettio/weave-buil This will clone the weave git repository, then do the build. When the build completes, the resulting images are stored in docker on -the host, as when building directly under Ubuntu. The exported images -are present under `/var/tmp/` inside the container, and can be -retrieved using `docker cp` if needed. +the host, as when building directly under Ubuntu. The container arguments are passed to `git clone`, so for example, you can build from a forked repository and a specific branch with: