Docker-组合名为挂载的卷

为了跟踪 docker-compose 使用的卷,我想使用命名卷。这对于“普通”卷非常有用,比如

version: 2
services:
example-app:
volume:
-named_vol:/dir/in/container/volume
volumes:
named_vol:

但是我不知道在安装本地主机时如何让它工作。 我要找的是这样的东西:

version: 2
services:
example-app:
volume:
-named_homedir:/dir/in/container/volume
volumes:
named_homedir: /c/Users/

或者

version: 2
services:
example-app:
volume:
-/c/Users/:/home/dir/in/container/ --name named_homedir

这有可能吗? 还是我只能用匿名卷来安装?

90542 次浏览

Host volumes are different from named volumes or anonymous volumes. Their "name" is the path on the host.

There is no way to use the volumes section for host volumes.

I was looking for an answer to the same question recently and stumbled on this plugin: https://github.com/CWSpear/local-persist Looks like it allows just what topic started wants to do.

Haven't tried it myself yet, but thought it might be useful for somebody.

As you can read in this GitHub issue, mounting named volumes now is a thing … since 1.11 or 1.12.). Driver specific options are documented. Some notes from the GitHub thread:

docker volume create --opt type=none --opt device=<host path> --opt o=bind

If the host path does not exist, it will not be created.

Options are passed in literally to the mount syscall. We may add special cases for certain "types" because they are awkward to use... like the nfs example [referenced above].

– @cpuguy83

To address your specific question about how to use that in compose, you write under your volumes section:

my-named-volume:
driver_opts:
type: none
device: /home/full/path #NOTE needs full path (~ doesn't work)
o: bind

This is because as cpuguy83 wrote in the github thread linked, the options are (under the hood) passed directly to the mount command.

EDIT: As commented by…

  • …@villasv, you can use ${PWD} for relative paths.

  • …@mikeyjk, you might need to delete preexisting volumes:

     docker volume rm $(docker volume ls -q)
    OR
    docker volume prune
    
  • …@Camron Hudson, in case you have no such file or directory errors showing up, you might want to read this SO question/ answer as Docker does not follow symlinks and there might be permission issues with your local file system.

I've been trying the (almost) same thing and it seems to work with something like:

version: '2'
services:
example-app:
volume:
-named_vol:/dir/in/container/volume
-/c/Users/:/dir/in/container/volume
volumes:
named_vol:

Seems to work for me (I didn't dig into it, just tested it).

OP appears to be using full paths already, but if like most people you're interested in mounting a project folder inside the container this might help.

This is how to do it with driver_opts like @kaiser said and @linuxbandit exemplified. But you can try to use the usually available environment variable $PWD to avoid specifying full paths for directories in the docker-compose context:

logs-directory:
driver_opts:
type: none
device: ${PWD}/logs
o: bind