Table of Contents

, ,

Nomad volumes

Static volume

Define these on the client node.

# cat /etc/nomad/nomad.hcl 

data_dir  = "/var/lib/nomad"

bind_addr = "192.168.56.109"


client {
  enabled          = true
  servers          = ["192.168.56.105", "192.168.56.106", "192.168.56.107"]
  host_volume "my-data-volume" {
    path      = "/opt/hashicorp"
    read_only = false
  }
}

Restart nomad and use it in a job:

job "write‑file" {
  # Run the job once (no periodic scheduling)
  type = "batch"

  # Optional: limit the job to a single allocation
  datacenters = ["dc1"]
  group "writer" {
    count = 1

    task "create-file" {
      driver = "docker"

      config {
        # Small Alpine image with /bin/sh
        image = "alpine:latest"
        # The command that creates the file
        command = "/bin/sh"
        args    = ["-c", "echo 'Hello from Nomad!' > /custom/output.txt"]
      }

      # Mount a writable volume so the file persists after the container stops
      resources {
        cpu    = 100   # MHz
        memory = 64    # MB
      }

      # Define a host‑side volume (optional – if you want the file on the host)
      
       volume_mount {
         volume      = "example1"
         destination = "/custom"
         read_only   = false
       }
    }

    # Optional: define a named volume that maps to a host directory
     volume "example1" {
       type      = "host"
       source    = "my-data-volume"  
    }
  }
}

You will find the output at /opt/hashicorp/output.txt on a client node where this volume is defined.

Dynamic volumes

These can be created on any client and if constraints are not specified nomad will iterate over the available clients and choose one to create it on.

# cat dyn-vol.hcl
name      = "example"
type      = "host"
plugin_id = "mkdir"

capability {
  access_mode     = "single-node-single-writer"
  attachment_mode = "file-system"
}

Create the volume

# nomad volume create dyn-vol.hcl
==> Created host volume example with ID ad332141-073f-cc90-8c39-a0bb470a4970
  ✓ Host volume "ad332141" ready

    2025-11-06T10:26:15Z
    ID        = ad332141-073f-cc90-8c39-a0bb470a4970
    Name      = example
    Namespace = default
    Plugin ID = mkdir
    Node ID   = 28105807-febd-505a-d0bb-006443663051
    Node Pool = default
    Capacity  = 0 B
    State     = ready
    Host Path = /var/lib/nomad/host_volumes/ad332141-073f-cc90-8c39-a0bb470a4970



# nomad volume status
Dynamic Host Volumes
ID        Name     Namespace  Plugin ID  Node ID   Node Pool  State
ad332141  example  default    mkdir      28105807  default    ready

This will create it somewhere at /var/lib/nomad/host_volumes/ad332141-073f-cc90-8c39-a0bb470a4970/, the UUID will be different.

Use it in job

 job "write‑file" {
  # Run the job once (no periodic scheduling)
  type = "batch"

  # Optional: limit the job to a single allocation
  datacenters = ["dc1"]
  group "writer" {
    count = 1

    task "create-file" {
      driver = "docker"

      config {
        # Small Alpine image with /bin/sh
        image = "alpine:latest"
        # The command that creates the file
        command = "/bin/sh"
        args    = ["-c", "echo 'Hello from Nomad!' > /custom/output.txt"]
      }

      # Mount a writable volume so the file persists after the container stops
      resources {
        cpu    = 100   # MHz
        memory = 64    # MB
      }

      # Define a host‑side volume (optional – if you want the file on the host)
      # Uncomment the block below and adjust the path as needed.
      
       volume_mount {
         volume      = "example1"
        destination = "/custom"
         read_only   = false
       }
    }

    # Optional: define a named volume that maps to a host directory
     volume "example1" {
       type      = "host"
       source    = "example"  
       access_mode     = "single-node-single-writer"
       attachment_mode = "file-system"
    }
  }
}

Tested on

See also

References