Claude Skills Guide

Claude Code Docker Volumes Persistence Guide

When running Claude Code inside Docker containers, understanding how to persist data across container restarts becomes essential for maintaining development state, preserving generated artifacts, and managing skill configurations. This guide covers Docker volume strategies that work smoothly with Claude Code workflows.

Why Docker Volumes Matter for Claude Code

Docker containers are ephemeral by design—any data written inside a container disappears when the container stops. For Claude Code users who generate code, build projects, or run long-running agent tasks, losing that data breaks productivity. Volume mounting solves this by connecting host directory paths to container paths, ensuring your work survives container recreation.

The skill system in Claude Code stores configuration in specific locations. When you use skills like supermemory for persistent context or pdf for document generation, the generated outputs need stable storage locations. Without proper volume configuration, you would lose skill outputs and context on every container restart.

Bind Mounts: Direct Host Directory Access

Bind mounts map a specific host directory into your container. This approach gives Claude Code direct access to your existing project files, making it ideal for development workflows where you want the container to read and write to your host filesystem.

Create a Docker run command with a bind mount:

docker run -it \
  --name claude-dev \
  -v /Users/yourname/projects:/workspace \
  -v /Users/yourname/.claude:/root/.claude \
  ghcr.io/anthropic/claude-code:latest

This mounts your projects folder as /workspace inside the container, and your Claude configuration directory at /root/.claude. Any skills you install or configurations you modify persist to your host filesystem.

For Docker Compose, the equivalent configuration looks like:

services:
  claude:
    image: ghcr.io/anthropic/claude-code:latest
    volumes:
      - ./projects:/workspace
      - ~/.claude:/root/.claude

Named Volumes: Container-Friendly Data Management

Named volumes provide a Docker-managed storage mechanism that survives container removal. Unlike bind mounts, volumes exist independently of your host directory structure, making them portable across different host systems.

Create and use a named volume for Claude Code data:

docker volume create claude-skills
docker run -it \
  -v claude-skills:/data \
  ghcr.io/anthropic/claude-code:latest

In Docker Compose:

volumes:
  claude-skills:
    driver: local

services:
  claude:
    image: ghcr.io/anthropic/claude-code:latest
    volumes:
      - claude-skills:/data

This approach works well for storing skill outputs, cached data, and generated files that should persist across sessions. When you regenerate your container, the volume content remains intact.

Database Persistence with Named Volumes

One of the most common volume workflows involves persisting database data across container lifecycles:

version: '3.8'
services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: developer
      POSTGRES_PASSWORD: devpass
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  postgres_data:

The postgres_data named volume ensures your database files survive container recreation. This pattern applies to MySQL, MongoDB, and Redis containers as well—map each service’s data directory to a named volume.

Practical Volume Strategies by Use Case

Persisting Skill Configurations

Skills like tdd, frontend-design, and pdf store configuration in the Claude skills directory. Mount this directory to preserve skill settings:

docker run -it \
  -v ~/.claude/skills:/root/.claude/skills \
  ghcr.io/anthropic/claude-code:latest

Sharing Generated Files with Host

When Claude Code generates documentation, test files, or code, output goes to the working directory. Configure your volume to capture outputs:

docker run -it \
  -v /Users/yourname/project-output:/workspace/outputs \
  ghcr.io/anthropic/claude-code:latest

Database Persistence for Agent Workflows

If your Claude Code workflow involves databases, persist the database files:

docker run -it \
  -v postgres-data:/var/lib/postgresql/data \
  ghcr.io/anthropic/claude-code:latest

This applies whether you run PostgreSQL, SQLite, or any other database inside your container.

Backup and Restore Strategies

Named volumes make backups straightforward. Export volume contents to a tar archive:

docker run --rm \
  -v claude-skills:/data \
  -v $(pwd):/backup \
  alpine tar cvf /backup/claude-skills-backup.tar /data

Restore with:

docker run --rm \
  -v claude-skills:/data \
  -v $(pwd):/backup \
  alpine tar xvf /backup/claude-skills-backup.tar -C /

Schedule these backups using cron or your preferred task scheduler to protect against data loss.

Volume Permissions Considerations

Docker containers often run as root, which can create permission conflicts when writing to host directories. Handle this by specifying the user in your container run command:

docker run -it \
  --user $(id -u):$(id -g) \
  -v /Users/yourname/projects:/workspace \
  ghcr.io/anthropic/claude-code:latest

This matches container user permissions to your host user, preventing file ownership issues with generated code and artifacts.

Multi-Container Volume Sharing

When running Claude Code alongside supporting services like databases or cache servers, share volumes between containers:

services:
  claude:
    image: ghcr.io/anthropic/claude-code:latest
    volumes:
      - shared-data:/workspace/data

  redis:
    image: redis:alpine
    volumes:
      - shared-data:/data

volumes:
  shared-data:

Both containers access the same volume, enabling Claude Code to interact with Redis caching without network complexity.

Monitoring Volume Usage

Check volume disk usage to prevent storage exhaustion:

docker volume inspect claude-skills

This shows the mountpoint location. Use standard filesystem tools to analyze usage:

du -sh /var/lib/docker/volumes/claude-skills/_data

Summary

Docker volumes transform ephemeral containers into persistent development environments. Bind mounts give you direct host filesystem access, while named volumes provide portable, managed storage. Configure volumes based on your workflow—whether preserving skill configurations, capturing generated outputs, or maintaining database state. Regular backups using volume export ensure your Claude Code work survives any container mishaps.

Built by theluckystrike — More at zovo.one