簡體   English   中英

如何在 Kubernetes 內運行的 Django 應用程序中提供靜態文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM