Docker 装载路径会在kubernetes中创建一个新目录
我在挂载路径时遇到了问题。我的目标是即使pod重新启动,也能使数据持久化。但它会创建一个没有任何配置文件的新目录Docker 装载路径会在kubernetes中创建一个新目录,docker,kubernetes,docker-volume,persistent-volumes,Docker,Kubernetes,Docker Volume,Persistent Volumes,我在挂载路径时遇到了问题。我的目标是即使pod重新启动,也能使数据持久化。但它会创建一个没有任何配置文件的新目录 FROM centos:7 ENV DIR /binaries ENV PASS admin WORKDIR ${DIR} COPY libstdc++-4.8.5-39.el7.x86_64.rpm ${DIR} COPY numactl-libs-2.0.12-3.el7.x86_64.rpm ${DIR} COPY mysqlmonitor-8.0.18.1217-linux
FROM centos:7
ENV DIR /binaries
ENV PASS admin
WORKDIR ${DIR}
COPY libstdc++-4.8.5-39.el7.x86_64.rpm ${DIR}
COPY numactl-libs-2.0.12-3.el7.x86_64.rpm ${DIR}
COPY mysqlmonitor-8.0.18.1217-linux-x86_64-installer.bin ${DIR}
RUN yum install -y libaio && yum -y install gcc && yum -y install gcc-c++ && yum -y install compat-libstdc++-33 && yum -y install libstdc++-devel && yum -y install elfutils-libelf-devel && yum -y install glibc-devel && yum -y install libaio-devel && yum -y install sysstat
RUN yum install -y gcc && yum install -y make && yum install -y apr-devel && yum install -y openssl-devel && yum install -y java
RUN rpm -ivh numactl-libs-2.0.12-3.el7.x86_64.rpm
RUN useradd sql
RUN chown sql ${DIR}
RUN chmod 777 ${DIR}
RUN chmod 755 /home/sql
USER sql
WORKDIR ${DIR}
RUN ./mysqlmonitor-8.0.18.1217-linux-x86_64-installer.bin --installdir /home/sql/mysql/enterprise/monitor --mode unattended --tomcatport 18080 --tomcatsslport 18443 --adminpassword ### --dbport 13306
RUN rm -rf /binaries/*
VOLUME /home/sql/mysql/enterprise/monitor/mysql/data
ENTRYPOINT ["/bin/bash", "-c", "/home/sql/mysql/enterprise/monitor/mysqlmonitorctl.sh start && tail -f /home/sql/mysql/enterprise/monitor/apache-tomcat/logs/mysql-monitor.log"]
预期输出:我需要显示所有数据。请检查以下内容:
- 您使用Dockerfile卷的目的是在主机卷中持久化容器卷/home/sql/mysql/enterprise/monitor/mysql/data中的数据(即,对于每个节点,此数据都是唯一的——这是Kubernetes上存在持久卷抽象的方式)
- 集群中存在持久卷抽象(kubectl get pv)。它具有有效的PersistentVolume.spec.type(例如nfs、主机路径)
- 集群中存在一个PersistentVolumeClaim抽象(kubectl get pvc)
- 集群中存在一个部署抽象(kubectl get deploy)
- PersistentVolumeClaim.spec.volumeName与PersistentVolume.metadata.name匹配(或PersistentVolume.spec.claimRef.name与PersistentVolumeClaim.metadata.name匹配)
- Deployment.spec.template.spec.volumes[].persistentVolumeClaim.claimName与persistentVolumeClaim.metadata.name匹配
- Deployment.spec.template.spec.containers[].volumeMounts[]名称与Deployment.spec.template.spec.volumes[]名称匹配
- 找到PersistentVolume插件装载路径。让我们以Minikube集群为例。我正在使用:
- 创建一个示例文件:
- 按照上述检查创建部署:
- 测试指定目录中是否存在该文件:
在Dockerfile中,有几个对
/home/mysql/mysql
的引用,但是Kubernetes清单将持久卷装载在/home/sql/mysql
上(第一部分中没有“我的”)。
Deployment yaml file
apiVersion: apps/v1
kind: Deployment
metadata:
name: mypod
spec:
replicas: 1
selector:
matchLabels:
app: mem
template:
metadata:
labels:
app: mem
spec:
containers:
- name: mem
image: 22071997/mem
command:
volumeMounts:
- mountPath: /home/sql/mysql/enterprise/mysql/data
name: volume
volumes:
- name: volume
persistentVolumeClaim:
claimName: mem-
Output:
[sql@mypod-67cb4f85b8-9km26 data]$ pwd
/home/sql/mysql/enterprise/mysql/data
[sql@mypod-67cb4f85b8-9km26 data]$ ls
[sql@mypod-67cb4f85b8-9km26 data]$
$ kubectl get pv -o=jsonpath='{.items[0].spec.hostPath.path}'
/tmp/hostpath-provisioner/pvc-5e497ae8-943e-4651-86b9-4355c48d443dsv
$ touch /tmp/hostpath-provisioner/pvc-5e497ae8-943e-4651-86b9-4355c48d443d/1
$ ls /tmp/hostpath-provisioner/pvc-5e497ae8-943e-4651-86b9-4355c48d443d
1
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: test
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: test
spec:
containers:
- image: busybox
command:
- sleep
- "10000"
name: busybox
resources: {}
volumeMounts:
- mountPath: /tmp/test_dir
name: my-volume
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: myclaim
$ kubectl exec test-6f857854db-57fsz -- ls /tmp/test_dir
1