我正在使用docker-compose v2来构建我的容器(Django和Nginx)。
我想知道如何存储静态文件和媒体文件。一开始,我将它们作为卷存储在机器上,但机器崩溃了,我丢失了数据(或者至少,我不知道如何恢复它)。我认为把它存储在亚马逊S3上会更好,但没有相关指南(也许它意味着什么:)。
这是我的docker-compose文件:我尝试添加所需的字段(name、key、secret,...)但到目前为止还没有成功。
这条路对吗?谢谢!
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发布于 2016-07-24 17:10:07
这里是一个如何从容器上传文件到S3(用于备份)的示例,但也可以在主机操作系统中进行,因为您已经在主机操作系统上安装了一个容器卷。在此脚本中,我将媒体从S3下载到本地容器/服务器。在此之后,我使用pynotify查看目录static/media,以进行修改。如果发生任何更改,它将使用命令subprocess.Popen(upload_command.split(" "))将文件上载到S3。我认为你也可以根据你的问题修改这个脚本。在测试此脚本之前,您应该在OS的环境变量上设置AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。
有关更多详细信息,请访问S4cmd documentation。
#!-*- 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() https://stackoverflow.com/questions/38549460
复制相似问题