在gcsfuse安装的存储桶中的数据上在Google Cloud Instance上运行Docker

时间:2019-04-11 04:02:28

标签: docker google-cloud-platform mount gcsfuse

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

我已经能够使用gcsfuse成功安装Bucket,并且测试了可以在Bucket中创建和删除文件之类的事情。

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

但是,如果我尝试使用已安装的驱动器(即gcsfuse安装的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 --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 个答案:

答案 0 :(得分:1)

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

  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,因此无需在每次重新启动时手动执行这些步骤。

EXPLANATION:我在这里所做的是通过具有适当访问权限的用户/服务帐户通过凭证JSON显式指定凭证(此处未解释如何获取此凭证,但应该可以谷歌浏览),并在GOOGLE_APPLICATION_CREDENTIALS环境变量选项,如以下答案所建议:https://stackoverflow.com/a/39047673/10002593。由于某些原因,gcsfuse未注册与gcloud config中激活的帐户相同级别的访问权限,因此可能需要此环境变量。

答案 1 :(得分:0)

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

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中选择了“计算实例”和“ VM实例”

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

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

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

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

基于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 -(如here所述更改为超级用户之后,我仍然不能以root用户身份创建文件