docker - 在 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/"
解决方案
总结一下我们从运行在 elasticbeanstalk docker 容器中的 django 提供静态文件的解决方案SolutionStackName: 64bit Amazon Linux 2 v3.2.0 running Docker
:
collectstatic
在我们的容器真正准备好之前,我们不想运行。为此,我们在 entrypoint.sh 中启动它,不久之后它也会启动 gunicorn。- 我们让
collectstatic
静态文件从我们的设置中删除:
STATIC_ROOT = "static"
STATIC_URL = "/static/"
- 我们配置一个部署后脚本
.platform/hooks/postdeploy
,将静态文件从容器中复制到 ec2 vm 中/var/app/current
(脚本运行的地方):
#! /bin/bash
docker cp $(docker ps --no-trunc -q | head -n 1):/home/app/static .
- 我们通过将自定义配置文件放入以下位置来告诉 nginx 在哪里可以找到静态文件
.platform/nginx/conf.d/elasticbeanstalk/custom.conf
:
location /static/ {
root /var/app/current/;
}
而已。它对我们有用。
推荐阅读
- python - CS50 pset6 与 python 的可读性
- c# - ASP.Net Core 2.2 中枚举的本地化 DisplayAttribute
- python - 如何使用未绘制的 Dataframe 的 col 中的单独值(日期)注释 Seaborn 条形图
- gatling - 如何在加特林脚本中获取变量的值
- javascript - 如何在 processmaker 中从 Teatarea 中删除换行符
- ssl - 机器人框架测试期间的 SSLError
- reactjs - react native 和 expo:发送日志消息的问题 symbolicatedStack
- java - How model circular dependency in dagger2?
- python - 如何比较python中的层次回归模型?
- google-data-studio - 数据工作室社区可视化产品部署未重新加载