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

Posted

技术标签:

【中文标题】使用 gcsfuse-mounted Bucket 中的数据在 Google Cloud 实例上运行 Docker【英文标题】:Running Docker on Google Cloud Instance with data in gcsfuse-mounted Bucket 【发布时间】:2019-09-01 14:49:48 【问题描述】:

我正在尝试运行 Docker 容器来分析 Google Cloud Bucket 中的数据。

我已经能够使用gcsfuse 成功挂载存储桶,并且我测试了我可以执行诸如在存储桶中创建和删除文件之类的操作。

为了能够安装其他程序(并挂载存储桶),我安装了 Docker(并且没有使用 Docker 优化实例选项)。如果我以交互模式运行 Docker(不安装驱动器),它看起来工作正常。

但是,如果我尝试使用已安装的驱动器(即 gcsfuse-mounted Bucket)以交互模式运行 Docker,我会收到一条错误消息:

user@instance:~/bucket-name/subfolder$ docker run -it -v /home/user/bucket-name:/mnt/bucket-name gcr.io/deepvariant-docker/deepvariant
docker: Error response from daemon: error while creating mount source path '/home/user/bucket-name': mkdir /home/user/bucket-name: file exists.

我希望我即将完成这项工作:有人对针对此错误消息的相对简单的修复有任何想法吗?

顺便说一句,我意识到还有其他方法可以在 Google Cloud 上运行 DeepVariant,但我正在努力使事情尽可能类似于我在 AWS 上所做的事情(另外,我可能需要做一些额外的故障排除以进行分析我的一个文件)。

非常感谢您的帮助!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~

仅供参考,这就是我安装 Bucket 的方式:

#mount directory: https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/installing.md
export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install gcsfuse

#restart and mount directory: https://cloud.google.com/storage/docs/gcs-fuse
#NOTE: please make sure you are in your home directory (I encounter issues if I try to mount from /mnt)
mkdir [bucket-name]
gcsfuse -o allow_other --file-mode 777 --dir-mode 777 [bucket-name] ./[bucket-name]

这就是我安装 Docker 的方式:

#install Docker for Debian: https://docs.docker.com/install/linux/docker-ce/debian/
sudo apt-get update
sudo apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get -y --allow-unauthenticated install docker-ce docker-ce-cli containerd.io

#fix Docker sock issue: https://***.com/questions/47854463/got-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket-at-uni
sudo usermod -a -G docker [user]
#have to restart after this

【问题讨论】:

【参考方案1】:

对于遇到类似错误/问题的任何人 - 这对我有用。我采取的步骤:

    如果磁盘已经挂载,首先卸载它:sudo umount /mounted_folder 使用以下命令重新挂载磁盘,列出要明确使用的凭据文件
sudo GOOGLE_APPLICATION_CREDENTIALS=/home/user/credentials/example-asdf21b0af7.json gcsfuse -o allow_other bucket_name /mounted_folder
    现在应该可以成功连接,没有更多错误:)

注意:每次重新启动计算机/虚拟机后都需要运行此命令。可能可以将其格式化为fstab,这样就不需要在每次重新启动时手动执行这些步骤。

解释:我在这里所做的是通过凭据 JSON 为具有适当访问权限的用户/服务帐户明确指定凭据(此处未解释如何获取此信息,但应该可以使用谷歌搜索)并在GOOGLE_APPLICATION_CREDENTIALS 环境变量选项,正如这个答案所建议的那样:https://***.com/a/39047673/10002593。需要这个环境变量选项可能是因为gcsfuse 没有注册与gcloud config 中的激活帐户相同级别的访问权限。

【讨论】:

【参考方案2】:

我最近注意到,上面的命令集已经不足以拥有一个功能目录(例如,我无法添加或编辑文件)。

基于this discussion,我认为我需要添加-o allow_other参数。

但是,如果这就是我所做的一切,我会收到以下错误消息

fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf

如果我取消注释该文件中的相应行,我可以解决该错误消息。但是,这仍然不能解决在挂载目录中拥有正确的文件权限的问题。

然后,我尝试通过添加以下条目来编辑我的 /etc/fstab 文件

[bucket-name] /home/[username]/[bucket-name] gcsfuse rw,allow_other,file_mode=777,dir_mode=777

我也在相应地编辑顶部的内容(无论看起来有什么帮助)。

另外,请注意,这不是 Docker 特有的问题。这对于在存储桶中执行任何操作都是必要的。另外,我还没有真正解决这个新问题。

例如,通过sudo su - 更改为超级用户后,我仍然无法以root 身份创建文件(如here 所述)

【讨论】:

【参考方案3】:

另外,这是一个不同的问题,但我注意到我可以解决从存储桶运行可执行文件的问题,将命令从 gcsfuse [bucket-name] ./[bucket-name] 更改为 gcsfuse --file-mode 777 --dir-mode 777 [bucket-name] ./[bucket-name](我相应地更改了示例代码)

【讨论】:

【参考方案4】:

我想我至少找到了解决问题的部分方法:

如this tutorial 中所述,您还需要运行gcloud auth configure-docker

我发现您还需要退出并重新启动您的实例,但这严格解决了本文的原始错误消息。

我认为收到了一条奇怪的信息,但也许更多的是关于特定容器的信息。于是,我又进行了一次测试:

docker run -it -v /home/user/bucket-name:/mnt/bucket-name cwarden45/dnaseq-dependencies

这一次,我收到一条关于实例存储空间的错误消息(以便能够下载和运行 Docker 容器)。所以,我回去用更大的本地硬盘创建了一个新实例:

1) 在 Google Cloud Console 中,我选择了“Compute Instance”和“VM instances”

2)我点击了“创建实例”(和之前类似)

3)我选择“启动盘”下的“更改”

4) 我将大小设置为 300 GB 而不是 10 GB(目前,在“大小 (GB)”下的右下角)

与之前类似,我为“机器类型”选择了 8 个 vCPU,在“身份和 API 访问”下选择了“允许完全访问所有云 API”,并选中了“允许 HTTP 流量”和“允许 HTTPS 流量”(在“防火墙”下)。

没有选择“将容器映像部署到此 VM 实例”,我相信这就是我使用“sudo”安装 Docker 以便能够安装 gcsfuse 的方式。

我还必须将其称为“parital”解决方案,因为这使我可以在交互模式下成功运行 Docker 容器,但安装的存储桶在 Docker 中显示为空 .

对于另一个项目,我注意到如果我将可执行文件安装在 /opt 下的本地硬盘驱动器上,它们可以工作,但如果我尝试将它们安装在我的存储桶上(为了每次节省这些程序的安装时间) )。在 AWS 上,我相信我需要使用 EFS 存储而不是 S3 存储来做类似的事情,但我会继续学习更多关于使用 Google Cloud Bucket 进行挂载存储/分析的知识。

【讨论】:

以上是关于使用 gcsfuse-mounted Bucket 中的数据在 Google Cloud 实例上运行 Docker的主要内容,如果未能解决你的问题,请参考以下文章

mongodb Aggregation聚合操作之$bucket

在 bigquery 中使用 RANGE_BUCKET 时如何显示存储桶名称

使用 pyspark 从 AWS s3 Bucket 读取 csv 时出错

使用 Rails 和 Paperclip 设置存储桶的名称放置域样式 (bucket.s3.amazonaws.com)

Python Pandas 使用 pd.qcut 创建新的 bin/bucket 变量

width_bucket 不返回等宽的桶