我正在尝试使用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
,所以似乎应该有一种方法可以让它在不必这样做的情况下运行。
答案 0 :(得分:0)
RUN命令是关于为dockerfile创建一个新层,所以你实际上是在创建映像期间运行该命令,而Flex构建系统并不喜欢这样。
我不确定为什么在应用程序中出现问题不起作用,你可以在python子进程中尝试'sudo',或者可以通过添加'gcsfuse setup&amp;&amp; “到dockerfile中的ENTRYPOINT。