【问题标题】:use gcsfuse to mount google cloud storage buckets in a docker container使用 gcsfuse 在 docker 容器中挂载谷歌云存储桶
【发布时间】:2016-04-17 22:04:27
【问题描述】:

我正在尝试从 docker 容器中挂载谷歌云存储桶并收到以下错误:

[root@cdbdc9ccee5b workdir]# gcsfuse -o allow_other  --debug_gcs --key-file=/src/gcloud_service_account.json my-bucket-name /gcloud
Using mount point: /gcloud
Opening GCS connection...
Opening bucket...
daemonize.Run: readFromProcess: sub-process: mountWithArgs: mountWithConn:     setUpBucket: OpenBucket: Bad credentials for bucket "my-bucket". Check the bucket name and your credentials.

我的凭据在我的主机上有效,但在正在运行的容器上无效。 API 说不要使用 root 进行连接,但您可以使用 -o allow_other 标志(熔断标志)覆盖它。任何想法都表示赞赏。

这是在 centos7 基础镜像上运行的

【问题讨论】:

  • 可能是个愚蠢的问题,但您是否也将凭证文件添加到容器中?您是如何启动容器的,它是否具有运行 fuse 的正确权限?请注意,这里还有一个音量插件; github.com/coduno/docker-volume-gcs
  • 是的,凭证文件肯定在 /src 目录中的主机上。我是这样启动容器的:docker run -p 3000:3000 \ -e GOOGLE_APPLICATION_CREDENTIALS=/src/gcloud_service_account.json \ --name gcsfuseTest \ path/to/image 来看看插件。不过,我计划在 Google Container Engine 上运行它。感谢您的回复。

标签: docker fuse gcsfuse


【解决方案1】:

Root 与 not 是一个红鲱鱼;有问题的凭据是 GCS 凭据。

有关将 GCS 凭据交给 gcsfuse 的文档,请参阅 here。最简单的方法是使用您最初配置 GCE VM 的凭据(假设您在 GCE 上运行),这使得运行 gcsfuse 通常无需任何进一步的努力即可工作。但如果这不起作用,您可以使用标志 --key-file 为 gcsfuse 提供您从 Google Developers Console 下载的 JSON 密钥文件的路径。

【讨论】:

  • 感谢您的回复。我计划在 Google Container Engine 中运行它,但正在 Docker 容器中本地测试 gcfuse 的东西。我已阅读您提供的 URL 上的所有文档,但它在 Docker 中不起作用。我可以让 gcsfuse 读取我的凭据的唯一方法是使用 --key-file。导出 GOOGLE_APPLICATION_CREDENTIALS=/src/gcloud_service_account.js 尚未生效。同样,这些凭据可以在我的主机笔记本电脑 (OSX) 上使用。你之前有让 gcsfuse 在 Docker 中工作吗?如果是这样,了解连接命令会很有用。再次感谢。
  • 我没有特别尝试过Docker,对配置Docker一无所知。但是 gcsfuse 在这里并没有做任何神奇的事情。它只是读取一个环境变量。如果它不起作用,那么任何配置都会导致该环境变量被设置(或它被设置为的值)一定有问题。无论如何,如果可行,您可以使用--key-file 吗?
  • 我终于可以挂载了,但是在读取或写入目录“输入/输出错误”时遇到了新问题。有关更多详细信息,请参阅更新的问题。感谢您的帮助。
  • 太棒了!您是否介意为新问题打开一个新问题(使用--foreground 运行以获取该问题的更多调试信息),并在此处提交您解决此问题的方式作为答案并将其标记为已接受?
  • 感谢雅各布萨的建议。关闭这个并在此处添加后续操作:stackoverflow.com/questions/34779921/…
【解决方案2】:

更新:我能够安装 gcsfuse。我必须使用 --priviledged 选项运行 docker。 (感谢#thaJeztah 的面包屑!)

【讨论】:

  • 你有这个 git repo 吗?我能够让 gcsfuse 在 docker 中运行,但我无法与其他图像共享它:(
  • 我无法通过 build 命令运行它。构建图像时是否有解决方法?我正在尝试将容器推送到谷歌云进行复制
【解决方案3】:

您确实希望避免使用--privileged 选项运行容器。 我相信您只需要添加 SYS_ADMIN 功能并访问/dev/fuse 设备即可。

docker run \
    --rm -it \
    --cap-add SYS_ADMIN \
    --device /dev/fuse \
    ubuntu

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 2017-05-26
    • 2018-05-08
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2022-01-21
    • 2019-09-05
    • 2023-03-18
    相关资源
    最近更新 更多