当前位置: 首页 > 知识库问答 >
问题:

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

申屠喜
2023-03-14

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

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

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

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

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上所做的事情(另外,我可能需要做一些额外的故障排除来分析我的一个文件)。

非常感谢您的帮助!

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

#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://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

共有3个答案

仰翔
2023-03-14

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

施晗日
2023-03-14

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

如本教程所述,您还需要运行gcloud auth-configure docker

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

我想得到了一个奇怪的消息,但也许那更多的是关于特定的容器。所以,我做了另一个测试:

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

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

1)在Google Cloud Console中,我选择了“计算实例”和“VM实例”

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进行装载存储/分析的知识。

梁丘琛
2023-03-14

对于任何经历类似错误/问题的人来说——以下是对我有效的方法。我采取的步骤:

  1. 首先卸载已经挂载的磁盘:sudo umount /mounted_folder
  2. 使用以下命令重新挂载磁盘,列出要显式使用的凭据文件
sudo GOOGLE_APPLICATION_CREDENTIALS=/home/user/credentials/example-asdf21b0af7.json gcsfuse -o allow_other bucket_name /mounted_folder

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

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

 类似资料:
  • 问题内容: 我们目前正在从Relay转移到React Apollo 2.1 ,而我正在做的事情似乎很糟糕。 上下文: 只有在通过用户身份验证(通过API密钥)的情况下,才必须渲染某些组件,因此有一个组件可以保护其余的树。 在中,它是这样使用的(显然,下面的所有片段都是最小的示例): 如果身份验证成功,将进行渲染。 在第一次渲染/安装时将身份验证突变发送到服务器,并相应地调用渲染道具。 看起来像这样

  • 我在两台服务器上部署了Apache Camel应用程序,它们使用JMSendpoint。我想确保一次只使用一条来自jmsendpoint的驼峰路由。我可以用于集群的唯一选项是使用数据库作为锁存储。Apache Camel是否提供了这样的功能?

  • 问题内容: 我想在Centos 7上运行Redis的多个实例。有人可以指出我的正确链接或在此处发布步骤。 我在Google上搜索了该信息,但没有找到任何相关信息。 问题答案: 您可以在单台计算机上使用不同的端口运行Redis的多个实例。如果这与您有关,则可以按照以下步骤操作。 通过安装第一个Redis实例,默认情况下它会监听。 对于第二实例,创建一个新的工作目录 默认的Redis实例用作其工作目录

  • 我正在尝试使用google cloud sql和云endpoint开发一个应用程序,从google cloud sql文档中我发现google loud sql的连接器不提供任何连接池机制,我尝试在线搜索以获得任何可能的教程或文档,这些教程或文档提供了池机制,但没有结果,google文档只是指出,您应该在finally块中关闭连接,而不需要任何连接池配置。我还遇到了BoneCp、TomcatDbC

  • 问题内容: 我有一个从docker-compose.yml指向的Dockerfile。 我希望将docker-compose.yml中的卷挂载在Dockerfile中之前进行。 Dockerfile: docker-compose.yml 首先执行Dockerfile,然后从docker-compose挂载是完全有意义的,但是有一种解决方法。 我想保持Dockerfile通用,同时从compose

  • 今天,当我去部署云运行应用程序的新版本时,我无法按deploy键。没有错误或什么都没有,只是一个没有响应的密钥。 我使用secret manager,我已经将问题缩小到添加秘密装载卷的步骤。执行此操作时,我在检查网络时收到以下错误。 <代码>{“约束”:“约束/gcp.SecretManagerFilesystemAccess”} 但是,当我在留档中查找约束时,这个约束不存在。 我确实设置了一些组