Skip to main content

EVVM Docker

EVVM Docker is a containerized environment for deploying EVVM Testnet Contracts without installing Foundry, Bun, or any other tooling locally. Everything is pre-built inside a Docker image.

Why use EVVM Docker?

ScenarioBenefit
Windows usersRun Foundry tools without WSL or native installation
CI/CD pipelinesReproducible, versioned deployment environment
Team developmentEveryone uses the exact same toolchain
Quick evaluationsGo from zero to deployed EVVM with a single command
Isolated environmentsNo conflicts with existing local tooling

Docker Image

The image is published to the GitHub Container Registry on every release:

docker pull ghcr.io/evvm-org/evvm-docker:latest
TagWhen updated
latestEvery push to main
3, 3.0, 3.0.2On versioned releases (v*.*.*)

Supports linux/amd64 and linux/arm64 (Apple Silicon included).

What's Included

Built on debian:bookworm-slim:

  • Foundryforge, cast, anvil, chisel
  • Bun — JavaScript/TypeScript runtime for the EVVM CLI
  • EVVM Testnet Contracts — cloned and dependencies installed at build time
  • EVVM CLI — ready to run
  • Makefile — optional convenience wrappers

Prerequisites

Project Structure

evvm-docker/
├── Dockerfile # Image definition
├── docker-compose.yml # Service configuration and volume mounts
├── .env.example # Environment variables template
├── Makefile # Optional convenience commands
├── QUICKSTART.md # Condensed quick reference
├── README.md # Full documentation
└── output/ # Deployment results (mounted volume)
└── deployments/
├── evvmDeployment.json
└── evvmRegistration.json

Environment Variables

All configuration is passed through a .env file mounted at runtime — no credentials are baked into the image.

# Single-chain deployment
RPC_URL="https://sepolia-rollup.arbitrum.io/rpc"

# Cross-chain deployment
EXTERNAL_RPC_URL="https://sepolia-rollup.arbitrum.io/rpc"
HOST_RPC_URL="https://0xrpc.io/sep"

# EVVM Registry (always Ethereum Sepolia)
EVVM_REGISTRATION_RPC_URL="https://gateway.tenderly.co/public/sepolia"

# Contract verification (optional)
ETHERSCAN_API="YOUR_ETHERSCAN_API_KEY"
Public RPC endpoints

Find free public RPC URLs at chainlist.org.

Never store private keys in .env

Use Foundry's encrypted keystore instead (see Wallet Management below).

Wallet Management

Docker volume (default)

Wallets are stored in a named Docker volume foundry-keystores and persist across all container runs. Import once:

docker compose run --rm --entrypoint /bin/bash evvm-cli
cast wallet import defaultKey --interactive
exit

Host keystore (alternative)

To share wallets with your host machine, edit docker-compose.yml:

volumes:
# - foundry-keystores:/root/.foundry/keystores # comment out
- ~/.foundry/keystores:/root/.foundry/keystores:ro # uncomment

Data Persistence

DataStoragePersists after docker compose down?
Wallets / keystoresNamed volume foundry-keystoresYes
Deployment outputs./output/ (host bind mount)Yes
Container filesystemEphemeral (--rm)No

Available Commands

Docker Compose

docker compose run --rm evvm-cli help                        # Show CLI help
docker compose run --rm evvm-cli version # Display version
docker compose run --rm evvm-cli deploy # Deploy EVVM
docker compose run --rm evvm-cli register # Register in the EVVM Registry
docker compose run --rm evvm-cli setUpCrossChainTreasuries # Set up cross-chain treasuries
docker compose run --rm evvm-cli install # Reinstall dependencies
docker compose run --rm evvm-cli dev # Developer utilities
docker compose run --rm --entrypoint /bin/bash evvm-cli # Interactive shell

Make (optional wrapper)

make help            # List all available targets
make build # Build the Docker image
make deploy # Deploy EVVM (interactive)
make register # Register EVVM in the registry
make shell # Open interactive bash shell
make version # Show CLI version
make stop # Stop containers (data preserved)
make clean-image # Remove the image only (volumes intact)
make clean-wallets # Remove only the keystore volume
make clean # Remove everything (image + volumes + data)
make rebuild # Force rebuild without Docker layer cache
make logs # Tail container logs