Docker 挂载 S3 容器

23

如何在 Docker 主机中挂载 S3 容器?有没有一种透明的方法来实现这一点?或者我是否需要使用 VOLUME 指令将卷挂载到主机驱动器上,然后手动使用 CRON 将文件备份到 S3 中?

2个回答

19

根据您想要实现的目标,有不同的方法,但以下是我使用s3fs-fuse完成它的方式:

我创建了一个基于Ubuntu的Docker镜像,并

  • 包含一些有用的依赖项(基于我的需求)
  • 安装 AWS CLI
  • 安装 s3fs-fuse
  • 将 S3 挂载到一个目录中

Dockerfile

FROM ubuntu:18.04

## Some utilities
RUN apt-get update -y && \
    apt-get install -y build-essential libfuse-dev libcurl4-openssl-dev libxml2-dev pkg-config libssl-dev mime-support automake libtool wget tar git unzip
RUN apt-get install lsb-release -y  && apt-get install zip -y && apt-get install vim -y

## Install AWS CLI
RUN apt-get update && \
    apt-get install -y \
        python3 \
        python3-pip \
        python3-setuptools \
        groff \
        less \
    && pip3 install --upgrade pip \
    && apt-get clean

RUN pip3 --no-cache-dir install --upgrade awscli

## Install S3 Fuse
RUN rm -rf /usr/src/s3fs-fuse
RUN git clone https://github.com/s3fs-fuse/s3fs-fuse/ /usr/src/s3fs-fuse
WORKDIR /usr/src/s3fs-fuse 
RUN ./autogen.sh && ./configure && make && make install

## Create folder
WORKDIR /var/www
RUN mkdir s3

## Set Your AWS Access credentials
ENV AWS_ACCESS_KEY=YOURAWSACCESSKEY
ENV AWS_SECRET_ACCESS_KEY=YOURAWSSECRETACCESSKEY

## Set the directory where you want to mount your s3 bucket
ENV S3_MOUNT_DIRECTORY=/var/www/s3

## Replace with your s3 bucket name
ENV S3_BUCKET_NAME=your-s3-bucket-name

## S3fs-fuse credential config
RUN echo $AWS_ACCESS_KEY:$AWS_SECRET_ACCESS_KEY > /root/.passwd-s3fs && \
    chmod 600 /root/.passwd-s3fs

## change workdir to /
WORKDIR /

## Entry Point
ADD start-script.sh /start-script.sh
RUN chmod 755 /start-script.sh 
CMD ["/start-script.sh"]

启动脚本应指定为:

start-script.sh

#!/bin/bash
s3fs $S3_BUCKET_NAME $S3_MOUNT_DIRECTORY

然后构建您的镜像,并且如果您在指定的目录中创建文件,则它也应该在S3控制台上反映出来,反之亦然。

我在这里提供了更详细的说明和一个可工作的示例: https://github.com/skypeter1/docker-s3-bucket


有没有办法避免将秘密信息放入图像中?并且它是在运行时获取的吗? - archit
为避免在docker build过程中使用密码,您可以在主机上单独创建.passwd-s3fs文件,然后在运行时将其挂载到docker容器中。在启动脚本中,使用带有参数passwd_file=<PATH_TO_MOUNTED_PASS_FILE>的s3fs。 - cya

1
目前流行的容器存储解决方案,如Flocker和EMC REX-Ray似乎没有提供Amazon S3的开箱即用支持。但是,如果您愿意将数据存储在Amazon EBS卷上,则EMC REX-Ray允许您创建、挂载和快照卷。
当然,您提出的方法也完全可行。您可以在运行容器的主机上安装AWS CLI,并编写一个简单的cron作业,将主机目录映射到容器卷的数据复制到您的S3存储桶。

1
我认为在这段时间内我会坚持使用AWS cli和cron job。也许EBS是一个更好的解决方案,但它还没有正式发布。非常感谢您的建议。 - Adam
5
很抱歉,你的回答几乎完全错误。EMC与问题有什么关系?首先,有一个s3-fuse驱动程序:https://github.com/s3fs-fuse/s3fs-fuse。使用fuse驱动程序,您可以将其挂载到主机上,然后从主机共享到docker。其次,似乎还有一个s3存储驱动程序:https://docs.docker.com/registry/storage-drivers/s3/。我仍在研究最佳实践。 - Atif
1
我们最终选择了EFS。基本上是在主机上挂载(/var/myefs),然后通过在docker文件中添加“VOLUME /var/myefs”来使其可用。我个人没有设置它,但如果您需要帮助,我可以查看详细信息。 - Atif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接