3

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

非常感谢您的帮助!

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

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

#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
4

4 回答 4

2

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

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

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

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

于 2020-10-23T00:55:46.797 回答
0

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

于 2019-04-16T02:19:33.570 回答
0

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

正如本教程中提到的,您还需要运行gcloud auth configure-docker.

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

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

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

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

1)从谷歌云控制台,我选择了“计算实例”和“虚拟机实例”

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

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

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

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

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

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

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

于 2019-04-13T17:26:41.657 回答
0

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

基于这个讨论,我认为我需要添加-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 特定的问题。 这对于在桶中做任何事情都是必要的。另外,我还没有真正解决这个新问题。

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

于 2019-07-18T02:00:50.053 回答