使用 gcsfuse 挂载时 Docker 文件已存在

Posted

技术标签:

【中文标题】使用 gcsfuse 挂载时 Docker 文件已存在【英文标题】:Docker file already exists when mounting with gcsfuse 【发布时间】:2018-12-11 08:11:43 【问题描述】:

所以,我使用gcsfuse --implicit-dirs [bucket] [mount-point] 命令在我的虚拟机上安装了一个 GCS 存储桶。 我使用与 docker 相同的 [mount-point] 来保存我的数据。但是,当我使用 docker-compose up 启动容器时,我收到一条错误消息,提示 mkdir file exists

我在卸载存储桶并使用gcsfuse --implicit-dirs -o allow_others [bucket] [mount-point] 再次安装它后让它工作。但是,我读到使用 -o allow_others 标志是不安全的。

如果不使用此标志,我应该如何使其工作?

【问题讨论】:

如果没有看到您的Dockerfile,就很难诊断。你介意发布一个链接吗? 【参考方案1】:

根据this link,需要标志-o allow_others。有几篇示例文章here 和here。

Here,他们也使用 -o allow_others 标志。使用相同的挂载点时出现相同的错误,尽管它们没有使用 GCS 存储桶。他们复制了你的问题。挂载时需要传递 -o allow_other 。否则 mount 只能由您当前的用户使用。 Docker 守护进程以 root 身份运行,而不是以普通用户身份运行,因此它无法访问文件。如果您的用户具有挂载权限,则挂载时不需要 Sudo。请参阅this。

【讨论】:

我无法 mkdir 或触摸容器内部,即使我包含了 allow_other 标志。 感谢您的回复。您能告诉我您使用了我发布的哪些文件吗?此外,为了重现该问题,您可以让我知道有关您的容器图像的更多详细信息。 我尝试了所有链接,但没有一个有帮助。我有两个 docker 容器,其中一个带有一个简单的 nginx,它将代理流量反向到 php-fpm 7.2.2 映像,该映像本质上是一个 Laravel 应用程序。【参考方案2】:

我尝试做同样的事情,但遇到了很多问题。我写了一个教程,解释了如何从 Docker 容器中端到端地在 GCE 上挂载 GCS 存储桶:

Retrofitting Apps for Cloud Storage with Zero Code Changes

【讨论】:

以上是关于使用 gcsfuse 挂载时 Docker 文件已存在的主要内容,如果未能解决你的问题,请参考以下文章

构建 docker 容器时 gcsfuse 无法挂载

使用 gcsfuse-mounted Bucket 中的数据在 Google Cloud 实例上运行 Docker

GCSFuse 提供范围未授权错误

在非特权的基于 Ubuntu 的 Docker 容器中使用 gcsfuse 拒绝权限

使用 gcsfuse 安装在 Compute Engine 实例上的 Google Cloud Bucket 不会创建文件

GCloud 中 Docker 中的 GCSFuse 安装失败