2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

何をやりたいか

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

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?