docker run \
    -d \
    --restart always
    -p 54377:54377 \                               # Nucleus (required)
    -p 8080:8080 \                                 # HTTP server
    -p 1883:1883 \                                 # MQTT server
    -p 8085:8085 \                                 # TCP server
    -p 8086:8086 \                                 # UDP server
    -p 8088:8088 \                                 # WebSockets server
    -v /mnt/docker/data/corrade/:/etc/corrade \


  • /mnt/docker/data/corrade/ is a host / local filesystem path where configuration files will be stored,
  • the Nucleus port is required for configuring Corrade but more than likely the other ports are not needed if the connectivity services are not used


Corrade run within a docker container using our official image on DockerHUB. The usage pattern is typical to running Corrade from the command line: the container is started, the user connects to the Nucleus port 54377 to configure Corrade, and then Corrade logs in to the grid.

The configuration files NucleusConfiguration.xml, CorradeConfiguration.xml and Log4Net.config are exported to the local path given by the volume mount (in the TL;DR section, that is /mnt/docker/data/corrade/).


Here is the Docker compose file that does the same but using docker-compose and it should also be compatible with docker swarm:

version: "3.7"

    image: wizardrysteamworks/corrade:latest
      - "54377:54377" # Nucleus (required)
      - "8080:8080"   # HTTP server
      - "1883:1883"   # MQTT server
      - "8085:8085"   # TCP
      - "8086:8086"   # UDP
      - "8088:8088"   # Websockets server
      - /mnt/docker/data/corrade/:/corrade/


The build system is based on Debian bullseye and here is a tree view of the filesystem layout of the build system:

├── Dockerfile
└── rootfs
    └── usr
        └── local
            └── bin
                └── run

5 directories, 2 files


Here is the Dockerfile that is placed at the root of the build system:

# for libssl compatiblity required for .net 5.0
FROM debian:bullseye-slim

# update package manager
RUN  apt-get update -y && \
     apt-get upgrade -y && \
     apt-get dist-upgrade -y && \
     apt-get -y autoremove && \
     apt-get clean

# unzip required for unpacking Corrade and all the rest are libraries
RUN apt-get install -y \
    coreutils \
    bash \
    unzip \
    libgssapi-krb5-2 \
    libssl1.1 \

# retrieve latest Corrade
ADD /tmp/

# unpack the latest Corrade
RUN unzip /tmp/ -d /corrade

# open port declaration, in order: Nucleus, HTTP, MQTT, TCP, UDP and WebSockets
EXPOSE 54377 8080 1883 8085 8086 8088

# add filesystem requirements
ADD rootfs /

# execute the bootstrapper that will start Corrade
RUN ["chmod", "+x", "/usr/local/bin/run"]
ENTRYPOINT ["/usr/local/bin/run"]


Next to the Dockerfile file there should be a directory created named rootfs that contains the path rootfs/usr/local/bin/ and the following script is placed at rootfs/usr/local/bin/run:

#!/usr/bin/env bash
# create a directory that will be mountable as a regular Docker volume
mkdir -p /etc/corrade
# now pivot user-editable files as a symlink into the Docker mountable volume directory
if [ ! -f /etc/corrade/CorradeConfiguration.xml ]; then
    cp /corrade/CorradeConfiguration.xml.default /etc/corrade/CorradeConfiguration.xml
ln -sf /etc/corrade/CorradeConfiguration.xml /corrade/CorradeConfiguration.xml
if [ ! -f /etc/corrade/NucleusConfiguration.xml ]; then
    cp /corrade/NucleusConfiguration.xml.default /etc/corrade/NucleusConfiguration.xml
ln -sf /etc/corrade/NucleusConfiguration.xml /corrade/NucleusConfiguration.xml
if [ ! -f /etc/corrade/Log4Net.config ]; then
    cp /corrade/Log4Net.config.default /etc/corrade/Log4Net.config
ln -sf /etc/corrade/Log4Net.config /corrade/Log4Net.config

Developer Notes

Some voodoo is performed by the run script that moves the configuration files to /etc/corrade, that will be exported to the host via a volume mount, and then the script creates back(sym)links to the Corrade directory such that some of the configuration files can be exposed in order to not resort to bind mounts.

It is fairly acceptable to resort to bind mounts; that is, expose the whole Corrade directory, even if it is docker-unorthodox to do so, but due to Nucleus that uses a lot of small files, as well as the Corrade cache that keeps growing, synchronizing the files between host and container takes a while (a long while, it took 15 minutes on the clock, as a cold start).


secondlife/scripted_agents/corrade/running_with_docker.txt · Last modified: 2024/03/21 03:44 by office

Access website using Tor Access website using i2p Wizardry and Steamworks PGP Key

For the contact, copyright, license, warranty and privacy terms for the usage of this website please see the contact, license, privacy, copyright.