我正在尝试使用 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
为我登录并运行,似乎应该有一种方法可以让它工作而不必这样做。