Django Docker Compose-使用AmazonS3添加卷

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(用于备份)的示例,但也将在主机操作系统中进行,因为

我正在使用docker compose v2构建我的容器(Django和Nginx)

我想知道如何存储静态和媒体文件。起初,我将它们作为卷存储在机器上,但是机器崩溃了,我丢失了数据(或者至少,我不知道如何恢复数据)。 我认为最好将其存储在AmazonS3上,但没有相关指南(可能它的意思是:))

这是我的docker撰写文件: 我试图添加所需的字段(名称、密钥、机密等),但迄今为止没有成功

这条路对吗? 谢谢


这里是一个如何将文件从容器上载到S3(用于备份)的示例,但也将在主机操作系统中进行,因为您在主机操作系统上安装了大量容器。 在这个脚本中,我将媒体从S3下载到本地容器/服务器。之后,我使用
pynotify
查看dir
static/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()