繁体   English   中英

AWS Lambda 只读文件系统错误无法创建包含 Docker 图片的目录

[英]AWS Lambda read-only file system error failed to create directory with Docker image

问题

Docker 图像编译成功,但由于其只读文件系统而从 Lambda 运行时失败。

概括

Luminati-proxy为其代理管理器集成了 docker。 我复制了他们的docker 文件并将其附加到我自己的 docker 文件,用于将脚本推送到 AWS Lambda。docker图像的构建是成功的,但是当推送到 Lambda 时,由于只读文件系统错误而失败

Failed to create directory /home/sbx_user1051/proxy_manager: [code=EROFS] Error: EROFS: read-only file system, mkdir '/home/sbx_user1051'
2022-02-28 19:37:22.049 FILE (8): Failed to create directory /home/sbx_user1051/proxy_manager: [code=EROFS] Error: EROFS: read-only file system, mkdir '/home/sbx_user1051' 

分析

在检查引用时,错误集中在 proxy_manager 安装上,并且由于目录更改(mkdir、mk_work_dir ...)而失败 这些更改是在 GitHub 的 .js 文件中进行的,该文件是从作为 proxy_manager 安装的 docker 文件中提取的。 显然Lambda 上唯一可变的目录是 /tmp目录,但是是否有一种解决方法可以在不将所有内容都放在 /tmp 目录下的情况下进行设置,因为它会在运行时自行清除? 每次运行都重新安装 proxy_manager 一点也不理想......

回答?

这可以像设置环境规定一样简单,例如:

ENV PATH=...
ENV LD_LIBRARY_PATH=...

如果是这样,我应该如何配置它们? 我在下面添加 docker 文件以供快速参考:

FROM node:14.18.1
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
    && apt-get update \
    && apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf \
      --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

USER root
RUN npm config set user root
RUN npm install -g npm@8.1.3
RUN npm install -g @luminati-io/luminati-proxy
ENV DOCKER 1
CMD ["luminati", "--help"]

我很欣赏你的洞察力!

长话短说:

  • 您应该改为利用 S3 存储桶来存储、读取和修改任何文件。 所有 lambda 和微服务。 一般来说,应该始终被视为无状态
  • 所有 Luminati-proxy 功能都预置在 amazon lambdas 和 API Gateway 中
  • Lambda 函数并不意味着运行长时间运行的进程,因为它们最多只能运行 15 分钟,因此您尝试在 lambda 中运行的容器的设计必须在其设计中考虑 AWS 无服务器架构

解释:

根据 AWS Lambda 函数的文档

容器镜像必须能够在只读文件系统上运行。 您的 function 代码可以访问具有 512 MB 存储空间的可写 /tmp 目录。

由于基于 Linux 图像的容器应该已经有一个名为/tmp的文件夹,您应该几乎可以随时从代码中访问该文件夹以进行读取(记住,只读FS)

如果您希望存储内容,亚马逊的解决方案是让您通过 S3 存储桶创建和管理任何内容,存储桶就像您在本地读取文件一样易于使用,但在 lambda 实例完成工作负载后仍可访问

有关如何使用 S3 存储桶的更多详细信息,请参阅使用节点 fs 从 aws s3 存储桶中读取文件和使用 NodeJS 将文件上传到 Amazon S3 无论使用何种语言,都有很多方法可以实现它。

这一切都基于 AWS 在其平台上推广的最佳实践。 lambda 保持无状态的地方

AWS Lambda 提供 /tmp 文件夹供用户在 lambda 上写入文件,因为我不了解您的问题上下文,但希望对您有所帮助。 您可以在 /tmp 文件夹中将文件写入 AWS Lambda,例如。 我想在运行时/以编程方式使用 AWS lambda 创建一个文件 demo.txt,然后我可以将该文件写入 /txt/demo.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM