django + nginx + kubernetesでstatic fileをnginxから見せる方法(訂正)

# 何をやりたいか
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

```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

```manifest.yml
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`と`&&`で繋げば良い。簡単な話だった。