[英]Django pipeline - How to serve static files after running collectstatic?
[英]How to serve static files in Django application running inside Kubernetes
我有一個用 Django 構建的小應用程序。 它用作前端,並安裝在其中一個 K8S 集群中。
我正在使用 helm 部署圖表,但無法正確提供 Django 的靜態文件。
我在多個位置進行了搜索,但最終找不到可以解決我的問題的位置。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: orion-toolbelt
namespace: {{ .Values.global.namespace }}
annotations:
# ingress.kubernetes.io/secure-backends: "false"
# nginx.ingress.kubernetes.io/secure-backends: "false"
ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/rewrite-target: /
ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
ingress.kubernetes.io/ingress.allow-http: "true"
nginx.ingress.kubernetes.io/ingress.allow-http: "true"
nginx.ingress.kubernetes.io/proxy-body-size: 500m
spec:
rules:
- http:
paths:
- path: /orion-toolbelt
backend:
serviceName: orion-toolbelt
servicePort: {{ .Values.service.port }}
django 中的靜態文件位置保持默認,例如
STATIC_URL = "/static"
用戶最終無法以這種方式訪問靜態文件..
我接下來該怎么做?
附加的是錯誤: HTML-static_files-error -- EDIT: 5/8/19 -- pod 的 deployment.yaml 如下所示:
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: {{ .Values.global.namespace }}
name: orion-toolbelt
labels:
app: orion-toolbelt
spec:
replicas: 1
selector:
matchLabels:
app: orion-toolbelt
template:
metadata:
labels:
app: orion-toolbelt
spec:
containers:
- name: orion-toolbelt
image: {{ .Values.global.repository.imagerepo }}/orion-toolbelt:10.4-SNAPSHOT-15
ports:
- containerPort: {{ .Values.service.port }}
env:
- name: "USERNAME"
valueFrom:
secretKeyRef:
key: username
name: {{ .Values.global.secretname }}
- name: "PASSWORD"
valueFrom:
secretKeyRef:
key: password
name: {{ .Values.global.secretname }}
- name: "MASTER_IP"
valueFrom:
secretKeyRef:
key: master_ip
name: {{ .Values.global.secretname }}
imagePullPolicy: {{ .Values.global.pullPolicy }}
imagePullSecrets:
- name: {{ .Values.global.secretname }}
EDIT2: 20/8/19 - 添加 service.yam
apiVersion: v1
kind: Service
metadata:
namespace: {{ .Values.global.namespace }}
name: orion-toolbelt
spec:
selector:
app: orion-toolbelt
ports:
- protocol: TCP
port: {{ .Values.service.port }}
targetPort: {{ .Values.service.port }}
您應該簡單地在容器中包含 /static 目錄,並在應用程序中調整它的路徑。 否則,如果它必須是 /static,或者您不想在容器中包含靜態文件,或者您希望其他容器訪問該卷,則應該考慮將 Kubernetes 卷掛載到您的 Deployment/Statefulset。
@編輯
您可以通過這種方式測試此路徑是否存在於您的 kubernetes pod 中:
kubectl get po
<- 此命令將為您提供 pod 的名稱
kubectl exec -it <name of pod> sh
<-此命令將讓您在容器外殼中執行命令。
如果您的路徑存在,您可以在那里進行測試。 如果是,則是您的應用程序的錯誤,如果不是,則是您在 Docker 中添加錯誤。
您還可以將路徑添加到 Kubernetes pod,而無需在 Docker 容器中指定它。 查看此鏈接了解詳情
正如社區成員Marcin Ginszt所描述的
根據帖子中申請的信息。 很難問你的 django/app config/settings 哪里有問題。
請參閱管理靜態文件(例如圖像、JavaScript、CSS)
注意:
提供文件- STATIC_URL = '/static/'
除了這些配置步驟之外,您還需要實際提供靜態文件。 在開發過程中,如果您使用 django.contrib.staticfiles,這將在 DEBUG 設置為 True 時由 runserver 自動完成(請參閱 django.contrib.staticfiles.views.serve())。 這種方法效率極低,而且可能不安全,因此不適合生產。
有關在生產環境中提供靜態文件的正確策略,請參閱部署靜態文件。
Django 本身不提供文件; 它將這項工作留給您選擇的任何 Web 服務器。
我們建議使用單獨的 Web 服務器(即不運行 Django 的服務器)來提供媒體服務。 這里有一些不錯的選擇:
nginx
Apache 的精簡版
在這里,您可以找到如何使用collectstatic 命令提供靜態文件的示例。
如果有幫助,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.