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