Kubernetes 不将数据复制到已安装的卷中

asu*_*hak 4 mysql docker kubernetes

根据此处的文档:\n https://docs.docker.com/storage/volumes/

\n\n
\n

如果启动一个创建新卷的容器,如上所述,并且该容器在要挂载的目录(例如上面的/app/)中有文件或目录,则目录\xe2\x80\x99s内容将被复制到该卷中。然后容器安装并使用该卷,并且使用该卷的其他容器也可以访问预先填充的内容。

\n
\n\n

换句话说,期望是,如果我在 /var/lib/mysql 中有这样的文件

\n\n
root@d8fa9a8b305a:/var/lib/mysql# ls\nauto.cnf         xtz           ib_logfile0  ibdata1  mysql               sys\ndebian-5.7.flag  ib_buffer_pool  ib_logfile1  ibtmp1   performance_schema\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,当我将卷装入时,/var/lib/mysql容器中的所有文件都应复制到我的卷中。

\n\n

但我发现这并没有发生:

\n\n
/var/lib/mysql/mysql # ls\nauto.cnf        ib_buffer_pool  ib_logfile0     ib_logfile1     ibdata1\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我挂载到 /var/lib/mysql 的卷的内容,正如您所看到的,该数据与 docker 映像本身的 /var/lib/mysql 中存在的数据不同。因此,结果是启动失败。

\n\n

注意:有问题的卷实际上是由 kubernetes 挂载的。所以,我在这里做出一个主要假设

\n\n
volumeMounts:\n        - name: xtz-persistent-storage\n          mountPath: "/var/lib/mysql/"\n
Run Code Online (Sandbox Code Playgroud)\n\n

相当于这样做:docker run -p 443:443 --rm -v mysql:/var/lib/mysql <image>

\n

Ant*_*nko 5

KubernetesVolumes与 Docker 不是一回事Volumes

来自 Kubernetes文档

Docker 也有卷的概念,尽管它有点松散且管理较少。在 Docker 中,卷只是磁盘上或另一个容器中的目录。生命周期不受管理,直到最近才出现本地磁盘支持的卷。Docker 现在提供卷驱动程序,但目前功能非常有限(例如,从 Docker 1.7 开始,每个容器仅允许一个卷驱动程序,并且无法将参数传递给卷)。

另一方面,Kubernetes 卷具有明确的生命周期 - 与包含它的 Pod 相同。因此,卷的寿命比 Pod 中运行的任何容器都长,并且数据在容器重新启动时得以保留。当然,当 Pod 不复存在时,卷也将不复存在。也许比这更重要的是,Kubernetes 支持多种类型的卷,并且 Pod 可以同时使用任意数量的卷。

从本质上讲,卷只是一个目录,其中可能包含一些数据,Pod 中的容器可以访问该目录。该目录的形成方式、支持它的介质及其内容均由所使用的特定卷类型决定。

因此,尽管概念的名称相同,但这是不同的volume

在挂载时,Kubernetes 会覆盖一个目标目录。

不幸的是,目前还没有办法合并已安装卷和容器中的内容。这是关于它的讨论之一。