Docker Error Guide: 'invalid volume specification' — Fix Mount Syntax
Fix Docker 'invalid volume specification': correct -v/--mount syntax, Windows path colons, missing container paths, relative sources, and named-volume vs bind-mount confusion so mounts attach.
- #docker
- #troubleshooting
- #errors
- #volumes
Stuck on this Docker with AI error? Get the free incident triage checklist
A one-page PDF — the exact steps to isolate, fix, and verify a production error like this one. No spam, unsubscribe anytime.
Overview
invalid volume specification is a parse-time error: Docker cannot make sense of the -v/--volume string you passed before it even tries to mount anything. The format of the volume argument is wrong — a missing field, an extra or misplaced colon, a relative path where an absolute one is required, or a Windows drive letter confusing the colon-delimited parser.
The literal error names the offending spec:
docker: Error response from daemon: invalid volume specification: '/data:ro'.
On Windows hosts the drive-letter colon is a frequent trigger:
docker: Error response from daemon: invalid volume specification: 'C:\Users\me\app:/app:rw': invalid mount config for type "bind": invalid mount path.
Symptoms
docker run/docker createfails instantly withinvalid volume specificationand the container is never created.- The same command works on a colleague’s machine but not yours (Windows vs Linux path differences).
- A Compose
volumes:entry rejected as malformed ondocker compose up. - The error names a string that is missing a container path, or has too many/few colons.
Common Root Causes
- Missing the container path —
-v /host/dataalone (bind mounts needsource:destination), or a stray option with no destination like-v /data:ro. - Relative host path — bind-mount sources must be absolute (
-v ./data:/appis invalid via-v; only--mountor Compose resolve relatives). - Too many colons — extra colon or an options field in the wrong position:
-v /host:/container:ro:z:extra. - Windows drive-letter parsing —
C:\path:/containerwhere the parser splits on the drive colon; needs the correct Docker Desktop path form. - Named volume vs bind confusion — treating a name like a path, or vice versa;
data:/app(named volume) vs/data:/app(bind). - Unquoted spaces or trailing colon — a path with spaces or a trailing
:breaking field parsing.
Diagnostic Workflow
Reproduce and read exactly which spec Docker rejected — the quoted string is the clue:
docker run --rm -v /data:ro alpine true
# invalid volume specification: '/data:ro' <- no container path
Count the colon-delimited fields; a Linux bind mount is source:destination[:options] (2–3 fields):
echo '/host/data:/app:ro' | awk -F: '{print NF" fields"}'
Confirm the host source is an absolute path:
realpath ./data # -v needs the absolute result, not the relative form
Prefer the explicit --mount syntax, which fails with a clearer message and forbids ambiguity:
docker run --rm --mount type=bind,source="$(pwd)"/data,target=/app,readonly alpine ls /app
For Compose, validate the file before running:
docker compose config
Example Root Cause Analysis
A developer’s start script failed on every machine with:
invalid volume specification: '/data:ro'
The intent was a read-only bind mount, but the destination path was missing — -v /data:ro was parsed as source /data, destination ro, which is not an absolute container path, so the whole spec was rejected. The author had dropped the container target.
The fix was to supply all three fields explicitly: -v /srv/data:/app/data:ro. To prevent the class of typo entirely, the team switched the script to the self-documenting long form, --mount type=bind,source=/srv/data,target=/app/data,readonly, which names each field and errors clearly if one is missing.
Prevention Best Practices
- Prefer
--mountover-vin scripts — itskey=valuefields are self-documenting and fail with precise messages. - Always give absolute host paths for bind mounts, or use Compose which resolves relatives against the file location.
- Include the container destination every time; a bind mount without a target is always invalid.
- On Windows, use Docker Desktop’s path form and avoid raw drive-letter colons in
-v. - Distinguish named volumes from binds: a leading
/(or./) means a bind mount; a bare name means a named volume. - Validate Compose with
docker compose configin CI to catch malformedvolumes:entries before deploy.
Quick Command Reference
docker run -v /abs/host:/container:ro img # correct 3-field bind
docker run --mount type=bind,source=/abs,target=/c,readonly img
docker run --mount type=volume,source=mydata,target=/data img
docker volume create mydata # named volume
docker compose config # validate compose volumes
realpath ./relative/path # resolve to absolute
Conclusion
invalid volume specification is a syntax error, not a mount failure — Docker rejected the string before mounting. Check that a bind mount has an absolute source and a container destination, count the colon fields, and mind Windows drive letters. Switching from -v to the explicit --mount form eliminates most of these mistakes and gives clearer errors. For runtime mount failures after the spec parses, see the invalid mount config for type bind guide and the full Docker guides.
Fixed it? Get 500 Docker with AI & DevOps AI prompts — free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.
Stuck on this? Start guided troubleshooting
Open an interactive diagnostic session with this error already loaded. Work a step-by-step plan, record what each check returns, land on a root cause, and export a clean incident summary — no account needed to start.
Did this fix your issue?
Solved it a different way?
Share the fix that worked for you — reviewed, then published to help the next engineer.
That looks like it may contain a secret (key, token, password, or connection string). Please remove it — a note with a detected secret can’t be published.
Thanks — that helps. Published notes appear after a quick review.
Trending errors this week
The error guides other engineers are actually reading right now.
- 1mount: wrong fs type, bad option, bad superblock
- 2Docker 'failed to set up container networking': Fix the Bridge and IP Pool
- 3Docker 'failed to create shim task': How to Fix the containerd Runtime Error
- 4Transport endpoint is not connected
- 5modprobe: FATAL: Module not found
- 6mount: wrong fs type, bad option, bad superblock
Get 500 Battle-Tested DevOps AI Prompts — Free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.