<p>I'm trying to deploy postgres/postgis on GKE, but I continue to get the permission error: <code>initdb: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted</code>. I've tried various fixes that I've researched but I've yet to get passed this error. Below is my deployment yaml.</p>

<p>What am I missing?</p>

<pre><code>apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: postgres
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: postgres
    spec:
      terminationGracePeriodSeconds: 10
      securityContext:
        runAsUser: 1000
        fsGroup: 1000
      containers:
        - name: postgres
          image: mdillon/postgis:10
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_DB
              value: "database"
            - name: POSTGRES_USER
              value: "postgres"
            - name: POSTGRES_PASSWORD
              value: "postgres"
          volumeMounts:
            - name: postgredb
              mountPath: /var/lib/postgresql/data
              subPath: data
      volumes:
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres-pvc
</code></pre>

Mike
<p>The clue can be found under the PGDATA section:</p>
<p><a href="https://hub.docker.com/_/postgres" rel="nofollow noreferrer">https://hub.docker.com/_/postgres</a></p>
<blockquote>
<p>This optional variable can be used to define another location - like a
subdirectory - for the database files. The default is
/var/lib/postgresql/data. If the data volume you're using is a
filesystem mountpoint (like with GCE persistent disks) or remote
folder that cannot be chowned to the postgres user (like some NFS
mounts), Postgres initdb recommends a subdirectory be created to
contain the data.</p>
<p>For example:</p>
<p>$ docker run -d <br />
--name some-postgres <br />
-e POSTGRES_PASSWORD=mysecretpassword <br />
-e PGDATA=/var/lib/postgresql/data/pgdata <br />
-v /custom/mount:/var/lib/postgresql/data <br />
postgres</p>
</blockquote>
<p>So you would need 2 items in the YAML to get the equivalent of the Docker command above:</p>
<ol>
<li><p>Mount the PVC to the default directory used by Postgres (which you already have in you YAML)</p>
<pre><code>volumeMounts:
  - name: &lt;volume_name&gt;
    mountPath: /var/lib/postgresql/data
    readOnly: false
</code></pre>
</li>
<li><p>Add PGDATA variable to the env variables:</p>
<pre><code>env:
  - name: PGDATA
    value: /var/lib/postgresql/data/pgdata
</code></pre>
</li>
</ol>
