首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Google Cloud实例上运行Docker,数据位于gcsfuse挂载的Bucket中

在Google Cloud实例上运行Docker,数据位于gcsfuse挂载的Bucket中
EN

Stack Overflow用户
提问于 2019-04-11 12:02:28
回答 4查看 1.7K关注 0票数 3

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

我已经成功地使用gcsfuse挂载了Bucket,并且我测试了我可以在Bucket中创建和删除文件等操作。

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

但是,如果我尝试在挂载驱动器(即gcsfuse挂载的Bucket)上以交互模式运行Docker,则会收到一条错误消息:

代码语言:javascript
复制
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.

我希望我已经接近完成这项工作:有没有人对这个错误消息有相对简单的修复方法?

顺便说一句,我意识到还有其他方法可以在谷歌云上运行DeepVariant,但我正在尝试使事情尽可能类似于我在亚马逊网络服务上所做的事情(另外,我可能需要做一些额外的故障排除来分析我的一个文件)。

非常感谢您的帮助!

~~~

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

代码语言:javascript
复制
#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的方式:

代码语言:javascript
复制
#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://stackoverflow.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
EN

回答 4

Stack Overflow用户

发布于 2020-10-23 08:55:47

对于任何遇到类似错误/问题的人来说-这是对我有效的方法。我采取的步骤:

如果磁盘已经挂载,

  1. 首先将其卸载:使用以下命令sudo umount /mounted_folder
  2. Remount磁盘,列出要显式使用的凭据文件

代码语言:javascript
复制
sudo GOOGLE_APPLICATION_CREDENTIALS=/home/user/credentials/example-asdf21b0af7.json gcsfuse -o allow_other bucket_name /mounted_folder

  1. 现在应该可以成功连接,不会再出现错误:)

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

说明:我在这里所做的是通过具有适当访问权限的用户/服务帐户的凭据JSON显式地指定凭据(这里没有解释如何获取凭据,但应该是googl-able),并在GOOGLE_APPLICATION_CREDENTIALS环境变量选项中引用该json,如以下答案所示:https://stackoverflow.com/a/39047673/10002593。之所以需要此环境变量选项,可能是因为出于某种原因,gcsfuse没有在gcloud config中注册与激活的帐户相同的访问级别。

票数 1
EN

Stack Overflow用户

发布于 2019-04-14 01:26:42

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

正如在this tutorial中提到的,您还需要运行gcloud auth configure-docker

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

我想我收到了一个奇怪的消息,但也许这更多的是关于特定的容器。因此,我运行了另一个测试:

代码语言:javascript
复制
docker run -it -v /home/user/bucket-name:/mnt/bucket-name cwarden45/dnaseq-dependencies

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

1)在Google Cloud控制台中,我选择了“计算实例”和“虚拟机实例”。

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

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

4) i将size设置为300 GB,而不是10 GB (当前位于右下角"Size (GB)“下)

与之前类似,我为"Machine type“选择了8个vCPU,在"Identity and API access”下选择了"Allow full access to all Cloud API“,并选中了"Allow HTTP traffic”和"Allow HTTPS traffic“(在”Firewall“下)的复选框。

我选择"Deploy a container image to VM instance“而不是”Deploy a container image to this VM instance“,我相信这就是我用"sudo”安装Docker以便能够安装gcsfuse的原因。

我还必须将其称为“Docker parital”解决方案,因为它允许我在交互模式下成功运行容器,,但在Docker中挂载的存储桶显示为空。

对于另一个项目,我注意到,如果我将可执行文件安装在/opt下的本地硬盘上,那么它们就可以工作,但如果我试图将它们安装在我的存储桶上(为了节省每次安装这些程序的时间),就不能这样做。在亚马逊网络服务上,我认为我需要使用EFS存储而不是S3存储来做类似的事情,但我会继续学习更多关于使用Google Cloud Bucket进行挂载存储/分析的信息。

票数 0
EN

Stack Overflow用户

发布于 2019-04-16 10:19:34

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55624506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档