最近使用Docker-Compose来实现对Docker容器集群的快速编排,在编写docker-compose.yml完之后,想运行下看看结果,这一试果然试出问题。我再文件中有对容器目录进行挂载,可是运行之后却报错。

compose docker up 存在的卷 挂载 无法更新卷中内容 docker-compose 挂载_docker

 

 

 这是yml文件中对mysql容器的编排

compose docker up 存在的卷 挂载 无法更新卷中内容 docker-compose 挂载_docker_02

 

 

 因为如果用docker run指令启动容器的话,参数-v挂载的卷不用事先创建,所以卷mysql我一开始是没有进行创建的,所以有没有可能是docker-compose不会自动替我创建卷的原因呢,这里我使用docker volume create对yml文件中指定的数据卷进行创建。

compose docker up 存在的卷 挂载 无法更新卷中内容 docker-compose 挂载_docker_03

 

可以看到此时所需的卷都已经创建,再次运行命令docker-compose up -d,发现还是一样的结果。此时想到docker挂载除了指定卷外还能挂载主机指定路径,尝试将所有挂载改成系统内某个目录,再运行,发现容器创建启动成功。

至此可以确认时挂载卷时存在问题,我又试着不指定卷名运行,发现也能成功,所以问题应该就是出现在指定卷名挂载上。

上百度查找相关资料没找到有用的,最后还是在谷歌上面找到解决方法。

compose docker up 存在的卷 挂载 无法更新卷中内容 docker-compose 挂载_驱动程序_04

 

 

 该资料中作者用了设置volume的mountpoint的方法解决,而我选择的是第二个方法,为此顺便看了下官方对extenal参数的定义

compose docker up 存在的卷 挂载 无法更新卷中内容 docker-compose 挂载_驱动程序_05

 

 

 翻译过来就是:

如果设置为true,则指定此卷是在合成之外创建的。DOCKE编写不尝试创建它,并且如果不存在,则会引发错误。

对于3.3及以下版本的格式,外部不能与其他卷配置键(驱动程序、驱动程序选项、标签)一起使用。对于第3.4版及以上版本,此限制不再存在。

在下面的示例中,不是尝试创建一个名为[项目名称]数据的卷,而是将一个现有的卷简单地称为数据,并将其装入DB服务的容器中。

 

根据文档的写法在yml文件中加上volumes的设置:

compose docker up 存在的卷 挂载 无法更新卷中内容 docker-compose 挂载_驱动程序_06

 

 保存后再次运行docker-compose up -d,容器启动成功,至此问题解决。