Использование Django с db.sqlite3 с постоянным томом в Kubernetes pod выводит - django.db.utils.OperationalError: unable to open database file

Я пытаюсь развернуть небольшое приложение Django, которое создает свою собственную базу данных db.sqlite3, в капсуле Kubernetes. Если делать это без постоянного тома для сохранения db.sqlite3, то все работает нормально, но при попытке сохранить ее в постоянном томе pod выдает django.db.utils.OperationalError: unable to open database file

Первая проблема, с которой я столкнулся, это когда эти команды:

python ./manage.py migrate
sh -c "envdir ${ENVDIR} python manage.py collectstatic"

были запущены в Dockerfile. После монтирования тома ни один из моих файлов не был виден. Я узнал, что тома K8s ведут себя иначе, чем тома docker, и моим решением было поместить команды в сценарий оболочки и выполнить его в CMD или ENTYPOINT. Это создавало файлы после монтирования и они были видны, но все равно не помогло решить текущую проблему.

Я пробовал использовать постоянный том, пробовал использовать том с определением hostPath и даже пробовал использовать initContainer, который имеет тот же образ, что и приложение, только он сначала устанавливает разрешения 777 для db.sqlite3 и выполняет две команды выше, но он даже не может запуститься по какой-то причине.

Вот deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
  namespace: app-prod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      securityContext:
        runAsUser: 0
        runAsGroup: 0
        fsGroup: 0
        fsGroupChangePolicy: "OnRootMismatch"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: role
                  operator: In
                  values:
                  - on-demand-worker
      terminationGracePeriodSeconds: 30
      containers:
      - name: notation
        image: myimage
        imagePullPolicy: Always
        command: ["bash", "-c", "python ./manage.py runserver 0.0.0.0:8000"]
        ports:
        - containerPort: 8000
          name: http
        volumeMounts:
          - name: myapp-data
            mountPath: /app/db.sqlite3
            subPath: db.sqlite3
        securityContext:
            privileged: true
        #securityContext:
        #allowPrivilegeEscalation: false
      initContainers:
      - name: sqlite-data-permission-fix
        image: myimage
        command: ["bash","-c","chmod -R 777 /app && python ./manage.py migrate && envdir ./notation/.devenv python manage.py collectstatic"]
        volumeMounts:
          - name: myapp-data
            mountPath: /app/db.sqlite3
            subPath: db.sqlite3
        resources: {}

      volumes:
        - name: myapp-data
          persistentVolumeClaim:
            claimName: notation

Разрешения, которые я вижу на хосте, выглядят хорошо, 777, как я и хотел, так что я действительно не знаю, в чем проблема... Любая помощь будет принята с благодарностью.

Вернуться на верх