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