Использование 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, как я и хотел, так что я действительно не знаю, в чем проблема... Любая помощь будет принята с благодарностью.