首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker Compose -使用亚马逊S3添加卷

Docker Compose -使用亚马逊S3添加卷
EN

Stack Overflow用户
提问于 2016-07-24 14:43:08
回答 1查看 1.8K关注 0票数 1

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

我想知道如何存储静态文件和媒体文件。一开始,我将它们作为卷存储在机器上,但机器崩溃了,我丢失了数据(或者至少,我不知道如何恢复它)。我认为把它存储在亚马逊S3上会更好,但没有相关指南(也许它意味着什么:)。

这是我的docker-compose文件:我尝试添加所需的字段(name、key、secret,...)但到目前为止还没有成功。

这条路对吗?谢谢!

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2016-07-24 17:10:07

这里是一个如何从容器上传文件到S3(用于备份)的示例,但也可以在主机操作系统中进行,因为您已经在主机操作系统上安装了一个容器卷。在此脚本中,我将媒体从S3下载到本地容器/服务器。在此之后,我使用pynotify查看目录static/media,以进行修改。如果发生任何更改,它将使用命令subprocess.Popen(upload_command.split(" "))将文件上载到S3。我认为你也可以根据你的问题修改这个脚本。在测试此脚本之前,您应该在OS的环境变量上设置AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

有关更多详细信息,请访问S4cmd documentation

代码语言:javascript
复制
#!-*- 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()  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38549460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档