我在docker-compose.yml
文件中看到了Docker卷定义,如下所示:
-v /path/on/host/modules:/var/www/html/modules
我注意到Drupal's official image,他们的docker-compose.yml
文件正在使用anonymous volumes。
注意评论:
volumes:
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
# this takes advantage of the feature in Docker that a new anonymous
# volume (which is what we're creating here) will be initialized with the
# existing content of the image at the same location
- /var/www/html/sites
有没有办法在容器运行后将匿名卷与主机上的路径相关联?如果没有,有匿名卷的重点是什么?
完整的docker-compose.yml示例:
version: '3.1'
services:
drupal:
image: drupal:8.2-apache
ports:
- 8080:80
volumes:
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
# this takes advantage of the feature in Docker that a new anonymous
# volume (which is what we're creating here) will be initialized with the
# existing content of the image at the same location
- /var/www/html/sites
restart: always
postgres:
image: postgres:9.6
environment:
POSTGRES_PASSWORD: example
restart: always
答案 0 :(得分:7)
添加更多信息以回应@JeffRSon的后续问题/评论,询问匿名卷如何增加灵活性,以及从OP回答这个问题:
有没有办法在容器运行后将匿名卷与主机上的路径相关联?如果没有,有匿名卷的重点是什么?
TL; DR :您可以通过“数据容器”将特定的匿名卷与正在运行的容器相关联,但这样可以灵活地覆盖现在的用例通过使用命名卷更好地服务。
在Docker 1.9中添加卷管理之前,匿名卷很有用。在此之前,您没有选择命名卷。在1.9版本中,卷成为具有自己生命周期的离散,可管理的对象。
在1.9之前,如果没有命名卷的能力,你必须首先创建一个数据容器
来引用它docker create -v /data --name datacontainer mysql
然后将数据容器的匿名卷安装到需要访问卷的容器中
docker run -d --volumes-from datacontainer --name dbinstance mysql
现在,使用命名卷更方便,因为它们更易于管理和更明确。
答案 1 :(得分:1)
如今匿名卷的一个可能用例是与绑定安装结合使用。当您想绑定某个文件夹但没有任何特定的子文件夹时。然后应将这些特定子文件夹设置为命名卷或匿名卷。它将保证这些子文件夹将出现在容器外部的容器文件夹中,但您根本不必将其放在主机上的绑定文件夹中。
例如,您可以将前端 NodeJS 项目内置在需要 node_modules 文件夹的容器中,但您根本不需要此文件夹进行编码。然后,您可以将项目文件夹映射到容器外的某个文件夹,并将 node_modules 文件夹设置为匿名卷。即使您的主机上的工作文件夹中没有 Node_modules 文件夹,它也会一直存在于容器中。
答案 2 :(得分:0)
匿名卷等效,将这些目录定义为图像的Dockerfile中的VOLUME。事实上,如果Dockerfile 中定义为VOLUME的目录是匿名卷,如果它们没有显式映射到主机。
拥有它们的重点是增加灵活性。
PD: 匿名卷已驻留在/ var / lib / docker(或您配置的任何目录)中的某个主机中。要了解它们的位置:
docker inspect --type container -f '{{range $i, $v := .Mounts }}{{printf "%v\n" $v}}{{end}}' $CONTAINER
注意:用容器名称替换$CONTAINER
。