amazon-web-services - AWS Batch 中的 Docker 上的 AWS S3 挂载
问题描述
我想在我用来运行一些 AWS Batch 作业的 Docker 容器上安装一个 AWS s3 存储桶。我一直在研究解决这个问题的几种方法,但我仍然不清楚如何让它在 AWS Batch 上工作,AWS Batch 将根据作业定义动态分配 EC2 实例。以下是我收集的想法,但我不确定如何将它们组合在一起:
- https://rexray.readthedocs.io/en/v0.9.0/user-guide/docker-plugins/ 我可以使用此插件将 S3 存储桶挂载为 Docker 卷,但不确定如何在 AWS Batch 上执行此操作。这个插件应该是 Docker 镜像的一部分吗?
- 我可以使用 s3fs-fuse,但有人告诉我,我将无法在 AWS Batch 实例上的 EC2 实例上安装或存储来自 S3 的任何文件,然后可以将其安装在 docker 中。- 有没有办法通过在 AMI 中包含一些将文件从 s3 复制到实例的代码来做到这一点?
- 有没有其他方法可以让它工作?
如果我的问题太基本,请原谅我。我对 Docker 和 AWS Batch 还很陌生。将不胜感激任何帮助!
谢谢 !
解决方案
我过去曾亲自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 中的s3://my-test-bucket/my-s3-output
. 这可以大大简化您的工作流程/减少胶水代码。
我的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 "$@"
推荐阅读
- python - 在字典中查找具有最短值列表的键
- java - OpenGL Java——批量创建 VBO
- julia - 如何在DifferentialEquations.jl 中使用新的初始化方案?
- javascript - 一个案例中的多个案例,一个得到元音但另一个字母不明白为什么
- javascript - Html select dropdownlist如何同时显示name和id
- python - 如何向熊猫数据框添加条件行
- r - R中非线性混合效应的不稳定性(使用nlme包)
- regex - 如何将不带引号的文件名与带引号的名称匹配?
- ios - 在删除帐户之前发出“你确定吗”警报
- android - 如何隐式更新 Android Firebase 中的节点