【问题标题】:AWS S3 mount on Docker in AWS BatchAWS Batch 中的 Docker 上的 AWS S3 挂载
【发布时间】:2021-02-21 04:29:33
【问题描述】:

我想在我用来运行一些 AWS Batch 作业的 Docker 容器上安装一个 AWS s3 存储桶。 我一直在研究解决这个问题的几种方法,但我仍然不清楚如何让它在 AWS Batch 上工作,AWS Batch 将根据作业定义动态分配 EC2 实例。 以下是我收集的想法,但我不确定如何将它们组合在一起:

  1. https://rexray.readthedocs.io/en/v0.9.0/user-guide/docker-plugins/ 我可以使用这个插件将 S3 存储桶挂载为 Docker 卷,但不确定如何在 AWS Batch 上执行此操作。这个插件应该是 Docker 镜像的一部分吗?
  2. 我可以使用 s3fs-fuse,但我被告知我将无法在 AWS Batch 实例上的 EC2 实例上安装或存储来自 S3 的任何文件,然后可以将其安装在 docker 中。 - 有没有办法通过在 AMI 中包含一些将文件从 s3 复制到实例的代码来做到这一点?
  3. 我还有其他方法可以让它工作吗?

如果我的问题太基本,请原谅我。我对 Docker 和 AWS Batch 还很陌生。非常感谢任何帮助!

谢谢!

【问题讨论】:

  • 作为一条建议,您应该避免使用 S3 作为挂载。 EFS 服务旨在用作 NFS 挂载。
  • 感谢您的建议。我正在使用工作流语言来运行我的作业,它可能与 EFS 不兼容。
  • 您可以通过 AWS Storage Gateway 在 EC2 实例上挂载 S3 存储桶。不过真的不知道它是如何与 AWS Batch 集成的......
  • it may not be compatible with EFS EFS 至少是一个真正的 FS 并且以这种方式运行,S3 具有最终/写后读一致性,因此请认真考虑它是否适合您(我会避免使用 S3 作为FS),确实 S3 是更便宜的存储,但它不是任何文件系统,挂载 S3 始终是一种“解决方法”,但有一些警告。无论如何,容器内部的 s3fs-fuse should work

标签: amazon-web-services docker batch-processing


【解决方案1】:

我过去曾亲自使用s3fs 解决过这个问题。使用 S3 作为挂载文件系统有一些注意事项,您最好熟悉一下(因为您正在处理不是文件系统的东西,就像文件系统一样,这是一个经典的泄漏抽象问题),但是如果您的工作流程相对简单并且没有出现竞争条件的可能性,您应该可以放心地做到这一点(尤其是现在 AWS S3 已于 2020 年 12 月自动发布了所有应用程序的读写一致性)。

回答你的其他问题:

我可以使用 s3fs-fuse,但有人告诉我,我将无法在 AWS Batch 实例上的 EC2 实例上安装或存储来自 S3 的任何文件,然后可以将其安装在 docker 中。 - 有没有办法通过在 AMI 中包含一些将文件从 s3 复制到实例的代码来做到这一点?

如果您使用s3fs 将您的 S3 存储桶挂载为 docker 中的文件系统,则无需担心将文件从 S3 复制到实例,实际上使用 s3fs 的全部意义在于您可以访问您在 S3 中的所有文件都可以从容器中移出,而无需从 S3 中移出。

假设您将 S3 存储桶 s3://my-test-bucket 安装到容器中的 /data。然后,您可以像my-executable --input /data/my-s3-file --output /data/my-s3-output 一样运行您的程序,就好像输入文件就在本地文件系统上一样。完成后,您可以看到输出文件将在 s3://my-test-bucket/my-s3-output 的 S3 上。这可以大大简化您的工作流程/减少胶水代码。

我的s3fs AWS 批处理容器的 dockerfile 如下所示:

FROM ubuntu:18.04

RUN apt-get -y update && apt-get -y install curl wget build-essential automake libcurl4-openssl-dev libxml2-dev pkg-config libssl-dev libfuse-dev parallel

RUN wget https://github.com/s3fs-fuse/s3fs-fuse/archive/v1.86.tar.gz && \
    tar -xzvf v1.86.tar.gz && \
    cd s3fs-fuse-1.86 && \
    ./autogen.sh && \
    ./configure --prefix=/usr && \
    make && \
    make install && \
    rm -rf s3fs-fuse-1.86 v1.86.tar.gz

RUN mkdir /data

COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh 为始终在主程序之前运行 s3fs 挂载提供了一种便利(这打破了每个 docker 容器一个进程的范式,但我认为这不是主要关注的原因)。它看起来像这样:

#!/bin/bash

bucket=my-bucket

s3fs ${bucket} /data -o ecs

echo "Mounted ${bucket} to /data"

exec "$@"

在此注意相关答案:https://stackoverflow.com/a/60556131/1583239

【讨论】:

    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 2021-03-26
    • 2018-08-29
    • 2017-10-19
    • 2021-03-03
    • 2018-12-01
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多