## Toolchain Containers

This folder contains artifacts for building a docker container which includes
all necessary language toolchains (C++, Java, Python, Go and libraries). This
container is the recommended toolchain container for [Remote caching and
execution with
Bazel](https://github.com/bazelbuild/bazel/tree/master/src/main/java/com/google/devtools/build/lib/remote).

## Before you begin

1.  Download and install the [Google Cloud
    SDK](https://cloud.google.com/sdk/docs/), which includes the
    [gcloud](https://cloud.google.com/sdk/gcloud/) command-line tool.

1.  Create a [new Google Cloud Platform project from the Cloud
    Console](https://console.cloud.google.com/project) or use an existing one.

1.  Initialize the Cloud SDK.

        gcloud init

## Usage

### Build with [Google Cloud Container Builder](https://cloud.google.com/container-builder/)

You will need a valid project ID to build the toolchain-container.

You can build a toolchain-container with
[debian8](https://console.cloud.google.com/launcher/details/google/debian8) as
the base container by running:

``` shell
container/build.sh -p my-project-id -d debian8 -c rbe-debian8 -t latest -b my-gcs-bucket
```

Congratulations! Your docker container is now available in [Container
Registry](https://cloud.google.com/container-registry/)

```shell
gcr.io/my-project-id/rbe-debian8:latest
```

You can pull the built container to local

```shell
gcloud docker -- pull gcr.io/my-project-id/rbe-debian8:latest
```

### Build locally

You can also build debian8-clang-fully-loaded container locally to for a quick
test. You would need
[Bazel](https://docs.bazel.build/versions/master/install.html) and
[Docker](https://docs.docker.com/engine/installation/) installed.

Run the following command:

```shell
container/build.sh -l -d debian8
```

You docker container is now available locally and you can try it out by running:

```shell
docker run -it rbe-debian8:latest /bin/bash
```
