1

我正在尝试使用 gcsfuse 在 AppEngine 灵活环境应用程序上安装 GCS 存储桶。

我的 Dockerfiles 包括以下内容:

# gscfuse setup
RUN echo "deb http://packages.cloud.google.com/apt cloud-sdk-jessie main" | tee /etc/apt/sources.list.d/google-cloud.sdk.list
RUN echo "deb http://packages.cloud.google.com/apt gcsfuse-jessie main" | tee /etc/apt/sources.list.d/gcsfuse.list
RUN wget -qO- https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
RUN apt-get update && apt-get install -y --no-install-recommends google-cloud-sdk gcsfuse strace
RUN gcsfuse --implicit-dirs my_bucket my_dir

我从这里拿走了大部分。这几乎只是安装 gcsfuse 的标准方式,加上--no-install-recommends.

如果我以这种方式启动应用程序,它不会安装驱动器。这对我来说并不奇怪,因为它似乎不是灵活环境的支持功能。

这是令人困惑的部分。如果我运行gcloud app instances ssh "<instance>",然后运行container_exec gaeapp /bin/bash,那么gcsfuse my_bucket my_dir工作正常。

但是,如果我运行gcloud app instances ssh "<instance>" --container gaeapp,则gcsfuse my_bucket my_dir失败并出现此错误:

fusermount: failed to open /dev/fuse: Operation not permitted

如果我将 gcsfuse 作为我的main.py.

基于这个未解决的线程,我运行strace -f并看到与该用户完全相同的问题,即 EPERM 问题。

[pid    59] open("/dev/fuse", O_RDWR)   = -1 EPERM (Operation not permitted)

无论我以哪种方式登录到容器(或者如果我从 运行子进程main.py),我都是 root 用户。如果我运行,export那么我确实会看到不同的变量,因此运行的内容会有所不同,但其他一切对我来说都是一样的。

我看到的其他建议包括使用 gcsfuse 标志-o allow_other-o allow_root. 这些都不起作用。

可能有一个线索,如果我尝试在umount无法运行的登录上运行gcsfuse,它会说"must be superuser to unmount",即使我是 root。

似乎可能有一些我不明白的安全设置。但是,由于理论上我可以main.py触发一个外部程序gcsfuse为我登录并运行,似乎应该有一种方法可以让它工作而不必这样做。

4

1 回答 1

0

RUN 命令是为您的 dockerfile 创建一个新层,因此您实际上是在创建映像期间运行该命令,这是 Flex 构建系统不喜欢的。

我不确定为什么在应用程序中进行脱壳不起作用,您可以尝试在 python 子进程中对其进行“sudo”处理,或者通过在 ENTRYPOINT 中添加“gcsfuse setup &&”将其从应用程序代码中推出码头文件。

于 2017-10-11T20:01:39.543 回答