wiki:nomad_volumes
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
- nomad 1.10.5
- AlmaLinux release 9.6 (Sage Margay)
See also
References
wiki/nomad_volumes.txt · Last modified: by antisa
