首页 > 解决方案 > 在 Elasticbeanstalk Docker 环境中提供 Django 静态文件

问题描述

使用 docker 环境将 Django 应用程序部署到 EB 时,静态文件返回 404。

我在 docker 容器上使用 gunicorn,并且由于不推荐/不可能(?)通过 gunicorn 提供静态文件,我想配置 EB nginx 以使用主机文件系统为它们提供服务。

Dockerfile

FROM python:3
....
....
# Expose listen ports
EXPOSE 8002

RUN chmod +x ./docker/container_start.sh

CMD ["sh", "./docker/container_start.sh"]

Dockerrun.aws.json

{
  "AWSEBDockerrunVersion": "1",
  "Ports": [
    {
      "ContainerPort": "8002"
    }
  ],
  "Volumes": [
    {
      "ContainerDirectory": "/app/assets",
      "HostDirectory": "/var/app/current/assets"
    }
  ]
}

我怎么能告诉 EB nginx 从服务/assets/*/var/app/current/assets并将其余部分代理到 docker 容器?

由于 docker 环境,像下面这样的东西不起作用。

option_settings:
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "www/static/"

标签: dockeramazon-elastic-beanstalk

解决方案


总结一下我们从运行在 elasticbeanstalk docker 容器中的 django 提供静态文件的解决方案SolutionStackName: 64bit Amazon Linux 2 v3.2.0 running Docker

  1. collectstatic在我们的容器真正准备好之前,我们不想运行。为此,我们在 entrypoint.sh 中启动它,不久之后它也会启动 gunicorn。
  2. 我们让collectstatic静态文件从我们的设置中删除:
STATIC_ROOT = "static"
STATIC_URL = "/static/"
  1. 我们配置一个部署后脚本.platform/hooks/postdeploy,将静态文件从容器中复制到 ec2 vm 中/var/app/current(脚本运行的地方):
#! /bin/bash
docker cp $(docker ps --no-trunc -q | head -n 1):/home/app/static .
  1. 我们通过将自定义配置文件放入以下位置来告诉 nginx 在哪里可以找到静态文件.platform/nginx/conf.d/elasticbeanstalk/custom.conf
location /static/ {
    root /var/app/current/;
}

而已。它对我们有用。


推荐阅读