何をやりたいか
Djangoをpython manage.py runserverではなくちゃんとnginxから見せようとすると、staticファイルをnginxから見せる必要があるので、それをどうするか?ということで以下の記事を書いた。
https://qiita.com/legacyworld/items/7eacfe9ba375ddaa0a81
この記事を書いた後に色々調べた結果、この記事よりましな方法があることに気が付いたのでそれを記載しようと思う
前回の記事からの変更点
Kubernetesでコンテナを起動するときにpostStartでコマンドを実行するのだが、そこで複数コマンドをまとめて実行できることに気が付いていなかったので、かなり無駄なことをしていた。
前回の記事の方法
Buildする際にcollectstaticとmigrateを全部やってしまう。
そのためcollectstaticで作られたstaticフォルダをどう見せるかに悩んだ
今回の記事の方法
Build時にはインストールのみ行い、collectstaticとmigrateはコンテナ起動時に行う
それに合わせてstaticフォルダとdbフォルダはPersistentVolumeで提供する
ソースコードはこちら
https://github.com/legacyworld/django_k8s
Dockerfile
FROM python:3.8-buster
WORKDIR /src
ADD ./ /src/
RUN pip3 install -r requirements.txt
# RUN mkdir db
# RUN chmod 777 db
# RUN python manage.py collectstatic
# RUN python manage.py migrate
# RUN chmod 777 ./db/db.sqlite3
RUN useradd -r -s /bin/false uwsgiusr
USER uwsgiusr
ENTRYPOINT ["uwsgi","--ini","/src/uwsgi.ini"]
db作成とcollectstaticはすべてコメントアウトした
Kubernetesのmanifest
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: static-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: db
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
run: web
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
spec:
selector:
matchLabels:
run: web
replicas: 1
template:
metadata:
labels:
run: web
spec:
containers:
- name: nginx
image: legacyworld/django_k8s_nginx:latest
env:
- name: PORT
value: "80"
ports:
- containerPort: 80
volumeMounts:
- name: static
mountPath: /usr/share/nginx/html/static
volumes:
- name: static
persistentVolumeClaim:
claimName: static-pvc
---
apiVersion: v1
kind: Service
metadata:
name: django
spec:
type: NodePort
ports:
- port: 8000
targetPort: 8000
protocol: TCP
selector:
run: django
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: django-deploy
spec:
selector:
matchLabels:
run: django
replicas: 1
template:
metadata:
labels:
run: django
spec:
containers:
- name: django
image: legacyworld/django_k8s_django:latest
volumeMounts:
- name: static
mountPath: /src/static
- name: db
mountPath: /src/db
lifecycle:
postStart:
exec:
command: ["sh","-c","python manage.py collectstatic --noinput \
&& python manage.py migrate"]
securityContext:
fsGroup: 999
volumes:
- name: static
persistentVolumeClaim:
claimName: static-pvc
- name: db
persistentVolumeClaim:
claimName: db
db用のPersistentVolume追加
これは特に難しいことはない
static用のPersistentVolume
Dajngoの/src/staticとNGINXの/usr/share/nginx/html/staticにマウントする
postStart
command: ["sh","-c","python manage.py collectstatic --noinput \ && python manage.py migrate"
sh -c
と&&
で繋げば良い。簡単な話だった。