【发布时间】:2018-04-24 01:04:28
【问题描述】:
根据此处的文档: https://docs.docker.com/storage/volumes/
如果你启动一个容器来创建一个新的卷,如上,并且容器在要挂载的目录中有文件或目录(如上面的 /app/),则目录的内容将被复制到卷中。然后容器挂载并使用该卷,其他使用该卷的容器也可以访问预填充的内容。
换句话说,期望是,如果我在 /var/lib/mysql 中有这样的文件
root@d8fa9a8b305a:/var/lib/mysql# ls
auto.cnf xtz ib_logfile0 ibdata1 mysql sys
debian-5.7.flag ib_buffer_pool ib_logfile1 ibtmp1 performance_schema
然后,当我将卷挂载到 /var/lib/mysql 时,容器中的所有文件都应该复制到我的卷中。
但我发现这并没有发生:
/var/lib/mysql/mysql # ls
auto.cnf ib_buffer_pool ib_logfile0 ib_logfile1 ibdata1
这是我挂载到 /var/lib/mysql 的卷的内容,如您所见,数据与 docker 映像本身的 /var/lib/mysql 中的数据不同。因此,启动失败。
注意:有问题的卷实际上是由 kubernetes 挂载的。所以,我在这里做了一个重要的假设:
volumeMounts:
- name: xtz-persistent-storage
mountPath: "/var/lib/mysql/"
相当于这样做:docker run -p 443:443 --rm -v mysql:/var/lib/mysql <image>
【问题讨论】:
-
根据kubernetes.io/docs/user-guide/walkthrough,mountpath 不应该用引号引起来。你可以试试不带引号的路径吗?
-
您是否使用 docker 容器而不只是 k8s pod 测试了该命令,因为您引用的是 docker 文档?此外,“新卷”是该报价中的一个非常重要的区别,其行为与现有卷有很大不同。
-
你是对的。当我只使用 Docker 时,我确实得到了预期的行为。
/var/lib/mysql中的文件被复制到命名卷中。我通过将相同的命名卷安装到另一个容器中来检查这一点,我可以看到复制的文件。 -
我没有答案,但这听起来确实像是一个主要假设。对于过去的类似用例,我最终使用 init 容器将数据复制到卷中。不确定它是否理想,但完成了它的工作。
-
不确定这是否适用于我的情况,因为我试图复制到卷的数据在容器中。如果 init 容器看不到这些数据,那么它就无法复制到挂载的卷中,对吧?
标签: mysql docker kubernetes