【问题标题】:how to mount a path as non root user in kubernetes如何在 kubernetes 中以非 root 用户身份挂载路径
【发布时间】:2020-04-10 15:38:47
【问题描述】:

我在 Kubernetes 集群中部署了一个以非 root 用户身份运行的 mysql 监控应用程序映像。当我尝试挂载一个路径以使数据持久化时,它会覆盖必须存在我的应用程序配置文件的目录(通过删除该路径内的所有内容来创建一个新目录)。即使我仍然尝试使用 init 容器,我也是无法挂载。

my docker file:
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/mysql/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"]
my deployment 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/monitor/mysql/data
          name: volume
      volumes:
      - name: volume
        persistentVolumeClaim:
          claimName: mem-pvc1
      initContainers:
      - name: permissionsfix
        image: alpine:latest
        command: ["/bin/sh", "-c"]
        args:
          - chown -R 1000:1000 /home/sql/mysql/enterprise/monitor/ && chmod -R 777 /home/sql/mysql/enterprise/monitor/ ;
        volumeMounts:
        - name: volume
          mountPath: /home/sql/mysql/enterprise/monitor
output:
[sql@mypod-775764db45-bzs8n enterprise]$ cd monitor/mysql
[sql@mypod-775764db45-bzs8n mysql]$ ls
LICENSE      LICENSE.router  README.meb     bin   docs     lib  my-large.cnf   my-small.cnf  new  runtime  support-files  var
LICENSE.meb  README          README.router  data  include  man  my-medium.cnf  my.cnf        run  share    tmp
[sql@mypod-775764db45-bzs8n mysql]$ cd data
[sql@mypod-775764db45-bzs8n data]$ ls
mypod-775764db45-bzs8n.err

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    这似乎与以非 root 用户身份挂载无关,但更重要的是,在现有目录上挂载卷将导致该目录看起来像是空的(或包含卷上发生的任何内容已经)。如果您将配置存储在您希望在该卷上的非卷上,那么您需要将该卷安装到不同的位置(因此它不会覆盖您的本地配置)并将该配置复制到已安装的卷位置。您可以在 init 容器中执行此操作,但请注意不要在每次启动容器时覆盖卷内容。

    【讨论】:

    • 我在挂载路径时遇到了问题。我的目标是让我的安装目录中的数据即使在 pod 重新启动时也保持不变。但是它会创建一个新目录。输出: [sql@mypod-67cb4f85b8-9km26 数据]$ [sql@mypod-67cb4f85b8-9km26 数据]$ pwd /home/sql/mysql/enterprise/mysql/data [sql@mypod-67cb4f85b8-9km26 数据]$ ls [ sql@mypod-67cb4f85b8-9km26 数据]$
    • 请检查我的问题中的 dockerfile 和 deploymemt 文件
    • 看起来您在 init 容器中使用了 /home/sql/mysql/enterprise/monitor 的 mountPath,然后在主容器中使用了 /home/sql/mysql/enterprise/monitor/mysql/data 的 mountPath。这会将volume 的内容挂载到容器中的该 mountPath,这在 2 个容器之间不一致,因此会导致意外行为。您可能要考虑将主容器的 mountPath 更改为与 init 容器一致的/home/sql/mysql/enterprise/monitor 的输出路径。
    猜你喜欢
    • 2020-12-10
    • 2019-08-19
    • 2019-01-21
    • 1970-01-01
    • 2020-11-02
    • 2021-09-02
    • 2011-02-28
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多