This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
This is a Docker image for running a Factorio headless server. It provides automated builds for multiple Factorio versions (stable and experimental) and supports both AMD64 and ARM64 architectures.
-
Docker Image Build System
build.py- Unified Python script that builds both regular and rootless Docker images frombuildinfo.jsondocker/Dockerfile- Main Dockerfile that creates the Factorio server imagedocker/Dockerfile.rootless- Dockerfile for rootless variant (runs as UID 1000)buildinfo.json- Contains version info, SHA256 checksums, and tags for all supported versions- Supports multi-architecture builds (linux/amd64, linux/arm64) using Docker buildx
-
Automated Updates
update.sh- Checks for new Factorio releases and updatesbuildinfo.json- Updates README.md with new version tags
- Commits changes and tags releases automatically
- Run by GitHub Actions to keep images up-to-date
-
Container Scripts
docker/files/docker-entrypoint.sh- Main entrypoint that configures and starts the serverdocker/files/docker-update-mods.sh- Updates mods on server startdocker/files/docker-dlc.sh- Manages DLC (Space Age) activationdocker/files/scenario.sh- Alternative entrypoint for launching scenariosdocker/files/players-online.sh- Checks if players are online (for watchtower integration)
-
RCON Client
docker/rcon/- C source for RCON client, built during Docker image creation- Allows sending commands to the running server
# Build regular images locally (single architecture)
python3 build.py
# Build rootless images only
python3 build.py --rootless
# Build both regular and rootless images
python3 build.py --both
# Build and push multi-architecture images (regular only)
python3 build.py --multiarch --push-tags
# Build and push both regular and rootless multi-architecture images
python3 build.py --multiarch --push-tags --both# Basic run command
docker run -d \
-p 34197:34197/udp \
-p 27015:27015/tcp \
-v /opt/factorio:/factorio \
--name factorio \
factoriotools/factorio
# Using docker-compose
docker-compose up -d# Lint Dockerfiles
./lint.sh# Check for new Factorio versions and update buildinfo.json
./update.shLOAD_LATEST_SAVE- Load the most recent save (default: true)GENERATE_NEW_SAVE- Generate a new save if none exists (default: false)SAVE_NAME- Name of the save file to load/createUPDATE_MODS_ON_START- Update mods before starting (requires USERNAME/TOKEN)DLC_SPACE_AGE- Enable/disable Space Age DLC (default: true)PORT- UDP port for game server (default: 34197)RCON_PORT- TCP port for RCON (default: 27015)
All data is stored in a single volume mounted at /factorio:
/factorio/
├── config/ # Server configuration files
├── mods/ # Game modifications
├── saves/ # Save games
├── scenarios/ # Scenario files
└── script-output/ # Script output directory
The project maintains compatibility with multiple Factorio versions:
- Latest experimental version gets the
latesttag - Latest stable version gets the
stabletag - Each version also gets specific tags (e.g.,
2.0.55,2.0,2) - Legacy versions back to 0.12 are supported
Version updates are automated via GitHub Actions that run update.sh periodically.
- Modify
buildinfo.jsonto test specific versions - Run
python3 build.pyto build regular images locally- Use
python3 build.py --rootlessfor rootless images - Use
python3 build.py --bothto build both variants
- Use
- Test the container with your local data volume
- For production changes, ensure
update.shhandles version transitions correctly