Skip to content

Running DICOM Capacitor in Docker

DICOM Capacitor is available as a Docker image at fluxinc/dicom-capacitor. The image supports both amd64 and arm64 architectures.

Quick Start

bash
mkdir -p data cache
docker run -d \
  --name capacitor \
  -p 1040:1040 \
  -p 1080:1080 \
  -v ./data:/data \
  -v ./cache:/cache \
  fluxinc/dicom-capacitor:latest

The web dashboard is available at http://localhost:1080. Check the logs for the activation URL on first run:

bash
docker logs capacitor

Docker Compose

yaml
# compose.yaml
services:
  capacitor:
    image: fluxinc/dicom-capacitor:latest
    ports:
      - "1040:1040"             # Store SCP (main DICOM storage)
      - "1080:1080"             # Web UI and REST API
      - "1041:1041"             # Worklist/Find SCP (optional)
      - "2763:2763"             # Query/Retrieve SCP (optional)
      - "1042:1042"             # Storage Commit SCP (optional)
    volumes:
      - ./data:/data
      - ./cache:/cache
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "echoscu", "-aec", "FLUX_CAPACITOR", "localhost", "1040"]
      interval: 30s
      timeout: 10s
      retries: 3

Volumes

The container uses two mount points:

VolumePurpose
/dataConfiguration files (config.yml, nodes.yml, lua.yml, scripts), licensing, logs
/cacheDICOM file processing cache (incoming, prepared, failed, etc.)

Create the directories before starting and ensure the container user has read/write access:

bash
mkdir -p ./data ./cache
chown -R 1000:1000 ./data ./cache   # Match the container user

You can optionally set the user: directive in your compose file to run as a specific UID/GID:

yaml
user: "1000:1000"

Port Mappings

Expose only the services you need:

PortServiceRequired?
1040Store SCP (receive DICOM images)Yes
1080Web UI and REST APIRecommended
1041Worklist/Find SCPOptional
2763Query/Retrieve SCP (C-FIND/C-MOVE)Optional
1042Storage Commitment SCPOptional

Disable any SCP by setting its port to 0 in config.yml or via environment variable (e.g., CAPACITOR_FIND_SCP_PORT=0).

Configuration via Environment Variables

Most config.yml settings can be overridden via environment variables using the CAPACITOR_ prefix. Property names are converted from camelCase to UPPER_SNAKE_CASE:

config.ymlEnvironment Variable
myAeTitleCAPACITOR_MY_AE_TITLE
scpPortCAPACITOR_SCP_PORT
filtersCAPACITOR_FILTERS
processDelayCAPACITOR_PROCESS_DELAY
processDelayWindowMultiplierCAPACITOR_PROCESS_DELAY_WINDOW_MULTIPLIER
suppressWebLogCAPACITOR_SUPPRESS_WEB_LOG
yaml
environment:
  CAPACITOR_MY_AE_TITLE: "MY_ROUTER"
  CAPACITOR_SCP_PORT: "11112"
  CAPACITOR_FILTERS: "lua"
  CAPACITOR_SUPPRESS_WEB_LOG: "true"   # Suppress web/API log file output

Environment variables override config.yml settings. Command-line overrides (--config.*) take highest priority.

Health Checks

The recommended health check uses echoscu (included in the container) to send a DICOM C-ECHO:

yaml
healthcheck:
  test: ["CMD", "echoscu", "-aec", "FLUX_CAPACITOR", "localhost", "1040"]
  interval: 30s
  timeout: 10s
  retries: 3

Replace FLUX_CAPACITOR with your configured myAeTitle. You can check the health status with:

bash
docker inspect --format='{{.State.Health.Status}}' capacitor

Viewing Logs

bash
# Follow logs in real-time
docker compose logs -f capacitor

# View last 100 lines
docker compose logs --tail=100 capacitor

The service log is also written to the /data/log/ volume, so you can access capacitor_service.log directly from the host:

bash
tail -f ./data/log/capacitor_service.log

Web/API request logs are written to a separate file (capacitor_service_web.log) to keep the main log focused on DICOM operations. To suppress web logs entirely (recommended in Docker), set CAPACITOR_SUPPRESS_WEB_LOG=true.

Upgrading

bash
docker compose pull
docker compose up -d

Configuration files in ./data/ are preserved across upgrades. Only the container image is replaced.

Troubleshooting

SymptomCheck
No DICOM response on expected portVerify port mapping matches scpPort (default 1040 inside container)
Web UI not accessibleEnsure port 1080 is mapped: -p 1080:1080
Permission denied on volumesEnsure host directory ownership matches container user (chown 1000:1000)
Activation requiredCheck logs for activation URL: docker compose logs capacitor
Container keeps restartingCheck logs for startup errors: docker compose logs --tail=50 capacitor
Images stuck in cacheVerify destination is reachable from inside the container: docker exec capacitor echoscu -aec DEST_AE host port