无法在 Cloud Run 上使用 gcsfuse 装载存储桶

Fre*_*red 6 google-cloud-storage docker gcsfuse google-cloud-run

借助 Google Cloud Run 第二代运行时,现在可以使用 gcsfuse 挂载 Google 存储桶。

https://cloud.google.com/run/docs/tutorials/network-filesystems-fuse

python3 示例运行良好。不幸的是,我的 Dockerfile 不断收到此错误:

bin/fusermount: failed to open /dev/fuse: Permission denied
mountWithArgs: mountWithConn: Mount: mount: running /bin/fusermount: exit status 1
Run Code Online (Sandbox Code Playgroud)

截屏

Dockerfile

# https://github.com/chiaen/docker-gcsfuse
FROM golang:1.17.5-alpine as gcsfuse
RUN apk add --no-cache git
ENV GOPATH /go
RUN go get -u github.com/googlecloudplatform/gcsfuse

FROM composer:2 as vendor
COPY composer.json composer.json
COPY composer.lock composer.lock
RUN composer install --ignore-platform-reqs --no-interaction --prefer-dist

FROM craftcms/nginx:7.4

ENV MNT_DIR /mnt/gcs

USER root
RUN apk add --no-cache mysql-client postgresql-client ca-certificates fuse nano sudo tini bash

RUN mkdir -p $MNT_DIR
RUN chown www-data:www-data $MNT_DIR
USER www-data

COPY --chown=www-data:www-data --from=vendor /app/vendor/ /app/vendor/
COPY --chown=www-data:www-data . .
COPY --from=gcsfuse /go/bin/gcsfuse /usr/local/bin
COPY supervisor.conf /etc/supervisor/conf.d/supervisor.conf
Run Code Online (Sandbox Code Playgroud)

由于文件较少,我将所有文件放入 github 存储库中。 https://github.com/internetztube/cloud-run-persistent-storage-issue

JM *_*lio 6

更新:

我解决了在 Cloud Run 中安装GCS 存储桶并读取/写入对象的问题,并进行了以下更改:

  • Dockerfile:
# https://github.com/chiaen/docker-gcsfuse
FROM golang:1.17.5-alpine as gcsfuse
RUN apk add --no-cache git
ENV GOPATH /go
RUN go get -u github.com/googlecloudplatform/gcsfuse

FROM composer:2 as vendor
COPY composer.json composer.json
COPY composer.lock composer.lock
RUN composer install --ignore-platform-reqs --no-interaction --prefer-dist

FROM craftcms/nginx:7.4

ENV MNT_DIR /mnt/gcs

USER root
RUN apk add --no-cache mysql-client postgresql-client ca-certificates fuse nano sudo tini bash
RUN mkdir -p $MNT_DIR
RUN chown www-data:www-data $MNT_DIR

COPY --chown=www-data:www-data --from=vendor /app/vendor/ /app/vendor/
COPY --chown=www-data:www-data . .
COPY --from=gcsfuse /go/bin/gcsfuse /usr/local/bin
COPY supervisor.conf /etc/supervisor/conf.d/supervisor.conf
Run Code Online (Sandbox Code Playgroud)
  • -file-mode=777 -dir-mode=777gcsfuse命令一起添加gcsfuse.sh以在GCS存储桶的挂载目录中启用读/写:
gcsfuse -o rw,allow_other -file-mode=777 -dir-mode=777 --foreground --debug_http --debug_gcs --debug_fuse --implicit-dirs $DISK_BUCKET $MNT_DIR
Run Code Online (Sandbox Code Playgroud)
  • 对路径进行硬编码(/mnt/gcs/demo.txt而不是../storage/demo.txt)以在文件中进行测试web/index.php

截图输出:

在此输入图像描述

  • @Fred 我修复了它,请查看更新的答案 (2认同)