docker通过-v 使用宿主机路径:容器内路径进行挂载时的问题

忧伤的蛋蛋
  • 1
新手上路,请多包涵

当我使用docker -v 宿主机路径:容器内路径 进行挂载时,其中主机路径都是为空的目录文件。这时针对不同的镜像文件会出现两种不同的情况
1、对于mysql的镜像时,当空的主机路径 /home/mysql/data:/var/lib/mysql 映射容器中的mysql的数据时,docker可以将容器内的数据覆盖到主机目录上
2、对于kibana镜像,当空的主机路径/home/kibana/config:/usr/share/kibana/config 映射容器中kibana配置时,docker却是将宿主机上的空目录覆盖到容器中的路径上,导致启动失败。

1、问:为什么会出现这两种情况,是因为镜像创建dockerfile内容有相应配置,还是其他原因?
2、问:对于第二中有什么其他对应的解决方案吗?现在我解决的方式是先运行容器 将容器内的文件先复制出来,然后挂载。有没有方案是能在挂载时,解决将宿主机空目录覆盖到容器中?

回复
阅读 1.2k
3 个回答
  1. 实际上-v参数就是将本地目录挂载到容器内,只不过mysql镜像做了特殊处理:
    mysql容器在启动之前,容器内的/var/lib/mysql其实就是空目录,在进行挂载和运行的时候,mysql的启动脚本 entrypoint.sh 会检测 /var/lib/mysql 目录是否存在,如果不存在就会执行 init_database 的操作,只有在执行init_database 操作之后,文件才生成。具体可以看entrypoint.sh 的220行 364行。

docker 容器启动的时候是以宿主机目录的内容为准的,即使宿主机是空目录,对应容器内目录有内容,你在容器内看到的也是个空目录,但是容器在运行中可以生成或修改文件到这个挂载目录,这个过程产生的数据是持久化到宿主机目录的。

Dockerfile 在书写的时候可以使用 VOLUME 指令表示在指定的挂载点,需要将 image 内的内容拷贝出来。

mysql 的 image 里 /var/lib/mysql 也确实使用了 VOLUME 声明。

VOLUME 的文档

宣传栏