最近使用Docker-Compose来实现对Docker容器集群的快速编排,在编写docker-compose.yml完之后,想运行下看看结果,这一试果然试出问题。我再文件中有对容器目录进行挂载,可是运行之后却报错。
这是yml文件中对mysql容器的编排
因为如果用docker run指令启动容器的话,参数-v挂载的卷不用事先创建,所以卷mysql我一开始是没有进行创建的,所以有没有可能是docker-compose不会自动替我创建卷的原因呢,这里我使用docker volume create对yml文件中指定的数据卷进行创建。
可以看到此时所需的卷都已经创建,再次运行命令docker-compose up -d,发现还是一样的结果。此时想到docker挂载除了指定卷外还能挂载主机指定路径,尝试将所有挂载改成系统内某个目录,再运行,发现容器创建启动成功。
至此可以确认时挂载卷时存在问题,我又试着不指定卷名运行,发现也能成功,所以问题应该就是出现在指定卷名挂载上。
上百度查找相关资料没找到有用的,最后还是在谷歌上面找到解决方法。
该资料中作者用了设置volume的mountpoint的方法解决,而我选择的是第二个方法,为此顺便看了下官方对extenal参数的定义
翻译过来就是:
如果设置为true,则指定此卷是在合成之外创建的。DOCKE编写不尝试创建它,并且如果不存在,则会引发错误。
对于3.3及以下版本的格式,外部不能与其他卷配置键(驱动程序、驱动程序选项、标签)一起使用。对于第3.4版及以上版本,此限制不再存在。
在下面的示例中,不是尝试创建一个名为[项目名称]数据的卷,而是将一个现有的卷简单地称为数据,并将其装入DB服务的容器中。
根据文档的写法在yml文件中加上volumes的设置:
保存后再次运行docker-compose up -d,容器启动成功,至此问题解决。