在AppEngine灵活环境中安装GCS存储桶

问题描述:

我试图在使用gcsfuse的AppEngine灵活环境应用上安装GCS存储桶。在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 

我把这个最从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 

这是同样的错误,我得到的,如果我跑gcsfuse在我main.py子进程。

基于此unresolved thread,我跑了strace -f,看到了与用户完全相同的问题,一个EPERM问题。

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

无论怎样我登录到容器(或如果我从main.py运行的子进程),我用户根。如果我运行export,那么我确实会看到不同的变量,所以在运行中有一些区别,但其他一切看起来都是一样的。

我见过的其他建议包括使用gcsfuse标记-o allow_other-o allow_root。这些都不起作用。

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

似乎可能有一些安全设置,我不明白。然而,因为我理论上可以得到main.py来触发一个外部程序来登录并运行gcsfuse对我来说,似乎应该有办法让它在没有这样做的情况下工作。

RUN命令是关于为dockerfile创建一个新图层的,因此您在创建图像时实际上正在运行该命令,而Flex构建系统并不喜欢这一命令。

我不知道为什么在应用程序中脱壳而出没有工作,你可以尝试“在Python子sudo'ing它,或者可能通过增加其推出的应用程序代码的‘gcsfuse设置& &’到dockerfile中的ENTRYPOINT。

+0

谢谢乔恩。我尝试了这些想法。入口点不适用于我(运行gcsfuse命令&& gunicorn)。尝试从python子进程调用sudo不起作用,因为没有找到sudo(用户无论如何都是root用户)。对我来说,主要的秘密在于对实例的sshing之间的区别,然后运行container_exec(gcsfuse works)和使用--container gaeapp(gcsfuse failed)进行sshing。 – hgbrian