Using Docker
The Transitive agent and capabilities can be installed in a Docker container. Please follow the instructions below or use our example docker image.
Build
Include this snippet in your Dockerfile:
ARG BASE_IMAGE
FROM ${BASE_IMAGE:-'ubuntu:20.04'}
RUN apt-get update
RUN apt-get install -y build-essential curl git lsb-release gnupg
# Fill in id and token from the curl command on your fleet page.
RUN curl -sf "https://install.transitiverobotics.com?id=...&token=....&docker=true" | bash
WORKDIR /transitive-preinstalled
# Optionally: add a custom configuration file
COPY config.json .
# Optionally: set some env vars, e.g., ROS_DOMAIN_ID, ROS_IP, etc.
COPY .env_user .
WORKDIR /root
COPY entrypoint.sh .
CMD ["./entrypoint.sh"]
The script run by the curl command will install the agent and detect the docker build environment, so it won't start the agent right away. Instead it will check the config.json file, if one was provided, and pre-install any specified desiredPackages. See Configuration for an example.
Edit your entrypoint or CMD script to include:
if [ ! -e $HOME/.transitive/.installation_complete ]; then
  cp -r /transitive-preinstalled/. $HOME/.transitive
  rm -rf /transitive-preinstalled
fi;
cd $HOME/.transitive
bash start_agent.sh
Note: the . at the end of the source in the cp command is important.
Make sure your entrypoint.sh is executable (chmod +x entrypoint.sh).
Run
- Since Transitive uses linux namespaces to sandbox capabilities, you need to run your container with --privileged. Using--security-opt seccomp=unconfinedmight work, too.
- Inside your container, $HOME/.transitiveneeds to be a bind-mounted folder from your host. For instance, runmkdir $HOME/transitive-dockerand run your container with-v $HOME/transitive-docker:/root/.transitive, if running as root inside your container.- This is required for two reasons:
- to give Transitive a place where it can permanently store files, and
- to allow usage of this folder for creating an overlayfs mount onto /usr inside the container.
 
 
- This is required for two reasons:
- Make sure, /etc/machine-idis not empty, e.g., runhostname > /etc/machine-idas part of your entry point. The ID you set needs to be unique for each robot in your fleet. Usually the file is written by systemd on first boot using a randomly generated id that is long enough to assume it is globally unique. But since docker images are, of coruse, usually shared between devices, this uniqueness guarantee may not exist, or the file may be empty completely if systemd is not used in the container.- Alternatively you can set the TR_INSTALL_HASHenvironment variable to an ID of your own choosing in the docker run command.
 
- Alternatively you can set the 
Example
docker run --privileged -v $HOME/.transitive:/root/.transitive -e TR_INSTALL_HASH=bot123 TAGNAME