Django Docker Compose-使用AmazonS3添加卷
我正在使用docker compose v2构建我的容器(Django和Nginx) 我想知道如何存储静态和媒体文件。起初,我将它们作为卷存储在机器上,但是机器崩溃了,我丢失了数据(或者至少,我不知道如何恢复数据)。 我认为最好将其存储在AmazonS3上,但没有相关指南(可能它的意思是:)) 这是我的docker撰写文件: 我试图添加所需的字段(名称、密钥、机密等),但迄今为止没有成功 这条路对吗? 谢谢Django Docker Compose-使用AmazonS3添加卷,django,amazon-web-services,amazon-s3,docker-compose,Django,Amazon Web Services,Amazon S3,Docker Compose,我正在使用docker compose v2构建我的容器(Django和Nginx) 我想知道如何存储静态和媒体文件。起初,我将它们作为卷存储在机器上,但是机器崩溃了,我丢失了数据(或者至少,我不知道如何恢复数据)。 我认为最好将其存储在AmazonS3上,但没有相关指南(可能它的意思是:)) 这是我的docker撰写文件: 我试图添加所需的字段(名称、密钥、机密等),但迄今为止没有成功 这条路对吗? 谢谢 这里是一个如何将文件从容器上载到S3(用于备份)的示例,但也将在主机操作系统中进行,因为
这里是一个如何将文件从容器上载到S3(用于备份)的示例,但也将在主机操作系统中进行,因为您在主机操作系统上安装了大量容器。 在这个脚本中,我将媒体从S3下载到本地容器/服务器。之后,我使用
pynotify
查看dirstatic/media
,以进行修改。如果发生任何更改,则使用命令subprocess.Popen(upload\u command.split(“”))将文件上载到S3
。
我认为你也可以根据你的问题修改这个脚本。
测试此脚本之前,应在OS的环境变量上设置AWS\u ACCESS\u KEY\u ID
和AWS\u SECRET\u ACCESS\u KEY
更多细节
你只是把文件备份到s3,对吗?为什么它比使用S3本身来提供文件更好?谢谢不,我不只是备份,还提供从S3到客户端的文件。我必须把文件放在磁盘上,因为
mezzanine
framework不太好用。我最初的问题是将mezzanine
与S3集成,然后这就是解决方案。我想在docker中将S3存储桶定义为卷,因此它对django来说是透明的,文件实际上保存在哪里。以某种方式,文件应该与S3同步。这是一种可能的方式。但是,它对Django是透明的。我以工作者身份启动此脚本。Django只为static/media
dir上传媒体,然后脚本自动将文件上传到S3。我最终使用Django存储将文件直接上传到S3,而不使用备份,并使用CDN进行用户请求SEE Django存储
version: '2'
services:
web:
build:
context: ./web/
dockerfile: Dockerfile
expose:
- "8000"
volumes:
- ./web:/code
- static-data:/www/static
- media-data:/www/media
env_file: devEnv
nginx:
build: ./nginx/
ports:
- "80:80"
volumes:
- static-data:/www/static
- media-data:/www/media
volumes_from:
- web
links:
- web:web
volumes:
static-data:
driver: local
media-data:
driver: s3
#!-*- coding:utf-8 -*-
import pyinotify
import os
import subprocess
from single_process import single_process
# You most have set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
# in enviromnet variables
PROJECT_DIR = os.getcwd()
MEDIA_DIR = os.path.join(PROJECT_DIR, "static/media")
AWS_BUCKET_NAME = os.environ.get("AWS_BUCKET_NAME", '')
S4CMD_DOWNLOAD_MEDIA = "s4cmd get --sync-check --recursive s3://%s/static/media/ static/" % (AWS_BUCKET_NAME)
UPLOAD_FILE_TO_S3="s4cmd sync --sync-check %(absolute_file_dir)s s3://"+ AWS_BUCKET_NAME +"/%(relative_file_dir)s"
# Download all media from S3
subprocess.Popen(S4CMD_DOWNLOAD_MEDIA.split(" ")).wait()
class ModificationsHandler(pyinotify.ProcessEvent):
def process_IN_CLOSE_WRITE(self, event):
try:
dir = event.path
file_name = event.name
absolute_file_dir=os.path.join(dir, file_name)
relative_dir=dir.replace(PROJECT_DIR, "")
relative_file_dir=os.path.join(relative_dir, file_name)
if relative_file_dir.startswith("/"):
relative_file_dir = relative_file_dir[1:]
print("\nSeding file %s to S3" % absolute_file_dir)
param = {}
param.update(absolute_file_dir=absolute_file_dir)
param.update(relative_file_dir=relative_file_dir)
upload_command = UPLOAD_FILE_TO_S3 % param
print(upload_command)
subprocess.Popen(upload_command.split(" "))
except Exception as e:
# log excptions
print("Some problem:", e.message)
@single_process
def main():
handler = ModificationsHandler()
wm = pyinotify.WatchManager()
notifier = pyinotify.Notifier(wm, handler)
print("\nListening changes in: " + MEDIA_DIR)
if MEDIA_DIR:
wdd = wm.add_watch(MEDIA_DIR, pyinotify.IN_CLOSE_WRITE, auto_add=True, rec=True)
notifier.loop()
if __name__ == "__main__":
main()