在AppEngine Flexible Environment上安装GCS存储桶

时间:2017-10-07 13:37:10

标签: google-app-engine fuse google-app-engine-python app-engine-flexible gcsfuse

我正在尝试使用gcsfuse在AppEngine Flexible Environment应用上安装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

我从here获取了大部分内容。它几乎只是安装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

如果我在我的main.py中将gcsfuse作为子进程运行,则会出现同样的错误。

根据此unresolved thread,我运行了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,可能会有一个线索,即使我是root用户,也会显示"must be superuser to unmount"

似乎可能有一些我不理解的安全设置。但是,因为我理论上可以让main.py触发一个外部程序来登录并为我运行gcsfuse,所以似乎应该有一种方法可以让它在不必这样做的情况下运行。

1 个答案:

答案 0 :(得分:0)

RUN命令是关于为dockerfile创建一个新层,所以你实际上是在创建映像期间运行该命令,而Flex构建系统并不喜欢这样。

我不确定为什么在应用程序中出现问题不起作用,你可以在python子进程中尝试'sudo',或者可以通过添加'gcsfuse setup&amp;&amp; “到dockerfile中的ENTRYPOINT。