Compose cannot find Swarm volumes when using volumes or volumes_from
Create a Swarm cluster (the best guide is Get started with multi-host networking) or use this handy gist.
volumesCreate a docker-compose.yml file
version: "2"
services:
test:
image: alpine
command: ls /
volumes:
- data:/data
volumes:
data:
external:
name: my-data
Run the following
$ docker volume create --name my-data
my-data
$ docker-compose --verbose up
...
compose.volume.initialize: Volume data declared as external. No new volume will be created.
compose.cli.verbose_proxy.proxy_callable: docker inspect_volume <- ('my-data')
ERROR: compose.cli.main.main: Volume my-data declared as external, but could not be found. Please create the volume manually using `docker volume create --name=my-data` and try again.
$ docker volume inspect my-data
[]
Error: No such volume: my-data
$ docker volume inspect swarm-agent1/my-data
[
{
"Name": "my-data",
"Driver": "local",
"Mountpoint": "/mnt/sda1/var/lib/docker/volumes/my-data/_data"
}
]
Compose and/or the volume inspect operation doesn't seem to understand the volume name will be prefixed with a node name in Swarm. And naturally we can't be encoding node names in our Compose files.
volumes_fromCreate a docker-compose.yml file
version: "2"
services:
test:
image: alpine
command: ls /
volumes_from:
- container:swarm-agent
Run the following
$ docker-compose --verbose up
...
compose.cli.verbose_proxy.proxy_callable: docker inspect_container <- (u'swarm-agent')
ERROR: compose.cli.main.main: Service "test" mounts volumes from "swarm-agent", which is not the name of a service or container.
$ docker inspect swarm-agent
[]
Error: No such image or container: swarm-agent
$ docker inspect swarm-agent2/swarm-agent
[ ... lots of JSON ... ]
Again, Compose and/or the container inspect operation doesn't seem to understand the container name will be prefixed with a node name in Swarm. And naturally we can't be encoding node names in our Compose files.
$ docker version
Client:
Version: 1.10.1
API version: 1.22
Go version: go1.5.3
Git commit: 9e83765
Built: Thu Feb 11 20:39:58 2016
OS/Arch: darwin/amd64
Server:
Version: swarm/1.1.3
API version: 1.22
Go version: go1.5.3
Git commit: 7e9c6bd
Built: Wed Mar 2 00:15:12 UTC 2016
OS/Arch: linux/amd64
$ docker-compose version
docker-compose version 1.6.0, build d99cad6
docker-py version: 1.7.0
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1j 15 Oct 2014
Possibly a duplicate of, or some overlap with #2958
I'm having the same issue. Here is my compose file
version: '2'
services:
interlock:
image: khamoud/interlock
command: -D run
tty: true
ports:
- 8080
environment:
INTERLOCK_CONFIG: |
ListenAddr = ":8080"
DockerURL = "${SWARM_HOST}"
TLSCACert = "/certs/ca.pem"
TLSCert = "/certs/server.pem"
TLSKey = "/certs/server-key.pem"
[[Extensions]]
Name = "nginx"
ConfigPath = "/etc/conf/nginx.conf"
PidPath = "/etc/conf/nginx.pid"
MaxConn = 1024
Port = 80
volumes:
- nginx:/etc/conf
- /etc/docker:/certs:ro
- /var/tmp/config.toml:/bin/config.toml
volumes:
nginx:
external: true
Here is the output of docker volume ls
local aws-manager0/nginx
local aws-node0/0cb67125e1a7873214140866aa04e75b5999363dc277b662cb0f5932d6c5714d
local aws-node0/nginx
local aws-node1/nginx
local aws-node1/bd34a4852c970511dc663ad88d97b473c3f6d381c8bcc702b57a1627693bea09
+1 - I have same issue.
Same issue here
+1 having same issue
I had this issue (with volumes not volumes_from), and I resolved it by removing same-named volumes from all swarm members other than the one where I wanted the service to run.
I also have node-affinity for each service that uses an external volume. I didn't test without the affinity.
It seems like you can now avoid this issue in the v2 compose format by using the explicit container:<container name> syntax.
(That is, blah still does not work, but container:blah now works)
Most helpful comment
I had this issue (with volumes not volumes_from), and I resolved it by removing same-named volumes from all swarm members other than the one where I wanted the service to run.
I also have node-affinity for each service that uses an external volume. I didn't test without the affinity.