在Minikube上为Postgres挂载主机目录-权限问题

时间:2018-11-19 16:20:46

标签: postgresql docker kubernetes minikube

我正在尝试在Minikube上安装PostgreSQL,并且数据路径是我在Minikube上安装的主机文件夹(我想将数据保留在主机上)。

在创建kubernetes对象之后(如下),我得到权限错误,与此处How to solve permission trouble when running Postgresql from minikube?相同,尽管提到的问题未能解决问题。它建议改为挂载minikube的VM目录。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres          
        volumeMounts:
          - mountPath: /var/lib/postgresql/data
            name: storage
        env:
        - name: POSTGRES_PASSWORD
          value: user
        - name: POSTGRES_USER
          value: pass
        - name: POSTGRES_DB
          value: k8s
      volumes:
        - name: storage
          hostPath:
            path: /data/postgres

除了在Postgres上构建自己的图像并以某种方式使用权限之外,还有其他方法可以做到吗?我在使用Minikube 0.30.0的macOS上,并且在Minikube的Virtualbox和hyperkit驱动程序中都遇到了这种情况。

1 个答案:

答案 0 :(得分:0)

从此处查看以下几行:hostPath

  

在基础主机上创建的文件或目录只能由root写入。您要么需要以root用户身份在特权容器中运行进程,要么需要修改主机上的文件许可权才能写入hostPath

因此,您要么必须以root用户身份运行,要么必须更改/data/postgres目录的文件许可权。

但是,您可以以root用户身份运行Postgres容器,而无需重建docker image。

您必须在容器中添加以下内容:

securityContext:
  runAsUser: 0

您的Yaml应该如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres          
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: storage
        env:
        - name: POSTGRES_PASSWORD
          value: user
        - name: POSTGRES_USER
          value: pass
        - name: POSTGRES_DB
          value: k8s
        securityContext:
          runAsUser: 0
      volumes:
      - name: storage
        hostPath:
          path: /data/postgres