# Docker Container

Docker container based on Ubuntu 18.04 LTS containing various hardware and
software development tools for OpenTitan, as listed in the
[OpenTitan documentation](../../doc/guides/getting_started/src/README.md).

## Local Build Instructions

For now, no pre-built containers are available; you'll need to build the Docker container locally.
First, you'll need to install Docker either through your package manager or their [download page](https://www.docker.com/get-started/).
You'll also need to clone the [OpenTitan repository](https://github.com/lowRISC/opentitan) if you haven't done that yet.
Then, from `$REPO_TOP` (the top-level directory in the repository, called `opentitan` by default), you can build the container with:

```shell
$ sudo docker build -t opentitan -f util/container/Dockerfile .
```

## Using the Container

Run the container with `docker run`, mapping the current working directory to
`/home/dev/src`. The user `dev` will have the same user ID as the current user
on the host (you!), causing all files created by the `dev` user in the container
to be owned by the current user on the host.

If you'd like to initialize your shell environment in a specific way, you can
pass an environment variable `USER_CONFIG=/path/to/a/script.sh`. Otherwise,
remove the `--env USER_CONFIG` argument from the invocation shown below.

The script passed through this mechanism will be sourced. The path of the script
must be within the container, e.g. in the OpenTitan repository directory.

```
docker run -t -i \
  -v $(pwd):/home/dev/src \
  --env DEV_UID=$(id -u) --env DEV_GID=$(id -g) \
  --env USER_CONFIG=/home/dev/src/docker-user-config.sh \
  opentitan:latest \
  bash
```

You can use `sudo` within the container to gain root permissions.
