Docker compose file
Dappnode packages are built upon Docker containers. The heart of defining how these containers run and interact lies in the docker-compose.yml
file. In this guide, we will explain the typical structure of the docker-compose.yml
file for a Dappnode package.
Basic Example
A simple docker-compose.yml
file looks like this:
version: "3.5"
services:
test.public.dappnode.eth:
build: .
image: "test.public.dappnode.eth:0.1.0"
restart: unless-stopped
This example illustrates the basic elements, which include the version of the docker-compose file, services, and the service's basic attributes.
Complex Example
A more intricate docker-compose.yml
file could look like this:
version: "3.5"
services:
beacon-chain:
build:
context: beacon-chain
args:
UPSTREAM_VERSION: v4.0.7
volumes:
- "beacon-chain-data:/data"
ports:
- "12603:12603/tcp"
- "12603:12603/udp"
restart: unless-stopped
environment:
P2P_PORT: 12603
CHECKPOINT_SYNC_URL: "https://checkpoints.mainnet.lukso.network"
EXTRA_OPTS: ""
LOG_VERBOSITY: info
MIN_SYNC_PEERS: "0"
MAX_PEERS: "250"
SUBSCRIBE_ALL_SUBNETS: "true"
validator:
build:
context: validator
args:
UPSTREAM_VERSION: v4.0.7
volumes:
- "validator-data:/data"
restart: unless-stopped
environment:
LOG_VERBOSITY: info
GRAFFITI: validating_from_DAppNode
ENABLE_DOPPELGANGER: "true"
EXTRA_OPTS: ""
volumes:
beacon-chain-data: {}
validator-data: {}
In the complex example, you'll find:
- Multiple services (like
beacon-chain
andvalidator
). - Build arguments, such as the relevant
UPSTREAM_VERSION
. - Defined volumes, ports, and environment variables.
Notable Features
Environment Variables
- All environment variables (
envs
) defined in thedocker-compose.yml
file will be visible in the package config post-installation. Users can modify these. - If the package has a
setup-wizard
, those environment variables not set within it will be hidden by default in the configuration. Users can view these by selecting "Show advanced config".
The UPSTREAM_VERSION
Argument
-
The
UPSTREAM_VERSION
argument is mandatory if you wish to leverage GitHub actions that automatically create PRs when there's a new release in the upstream repository. -
In the Dockerfile,
UPSTREAM_VERSION
is usually declared and used like this:ARG UPSTREAM_VERSION
FROM consensys/teku:$UPSTREAM_VERSION
The upstreamVersion
and upstreamRepo
fields need to be defined in the dappnode_package.json
file for the GitHub actions to work. Here is an example:
{
...
"upstreamVersion": "23.8.0",
"upstreamRepo": "ConsenSys/teku",
...
}
The EXTRA_OPTS
Environment Variable
-
EXTRA_OPTS
is an environment variable that allows users to add any flags that might not have been included by default. -
Here's a typical use case for
EXTRA_OPTS
in the entrypoint script:exec /opt/teku/bin/teku \
--network=prater \
...(omitting other flags) \
--log-destination=CONSOLE \
$EXTRA_OPTS