Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Google云实例上运行Docker,数据位于gcsfuse挂载的Bucket中_Docker_Google Cloud Platform_Mount_Gcsfuse - Fatal编程技术网

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

在Google云实例上运行Docker,数据位于gcsfuse挂载的Bucket中,docker,google-cloud-platform,mount,gcsfuse,Docker,Google Cloud Platform,Mount,Gcsfuse,我试图运行一个Docker容器来分析Google云存储桶中的数据 我已经能够使用gcsfuse成功地挂载Bucket,并且我测试过我可以在Bucket中创建和删除文件 为了能够安装其他程序(并装载bucket),我安装了Docker(没有使用Docker优化实例选项)。如果我在交互模式下运行Docker(不安装驱动器),它看起来工作正常 但是,如果我尝试在交互式模式下运行Docker与安装的驱动器(即gcsfuse安装的存储桶),我会收到一条错误消息: user@instance:~/bucke

我试图运行一个Docker容器来分析Google云存储桶中的数据

我已经能够使用
gcsfuse
成功地挂载Bucket,并且我测试过我可以在Bucket中创建和删除文件

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

但是,如果我尝试在交互式模式下运行Docker与安装的驱动器(即gcsfuse安装的存储桶),我会收到一条错误消息:

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

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

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

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

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

docker run -it -v /home/user/bucket-name:/mnt/bucket-name cwarden45/dnaseq-dependencies
这一次,我收到一条关于实例上存储空间的错误消息(以便能够下载并运行Docker容器)。因此,我返回并创建了一个新实例,该实例具有更大的本地硬盘驱动器:

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

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

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

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

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

我不是选择“将容器映像部署到此VM实例”,我相信这就是我让Docker安装了“sudo”以安装gcsfuse的原因

我还必须称之为“parital”解决方案,因为这允许我在交互模式下成功运行Docker容器,,但装载的bucket在Docker中显示为空


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

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

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

基于,我认为需要添加
-o allow\u 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特有的问题。这是基本上在bucket内执行任何操作所必需的。另外,我还没有真正解决这个新问题


例如,在通过
sudo su-
(如上所述)

更改为超级用户后,对于遇到类似错误/问题的任何人,我仍然无法以root用户身份创建文件-以下是对我有效的方法。我采取的步骤:

  • 如果磁盘已装入,请首先卸载它:
    sudo umount/mounted\u文件夹
  • 使用下面的命令重新装载磁盘,列出要显式使用的凭据文件
  • 现在应成功连接,无进一步错误:)
  • 注意:每次重新启动计算机/VM后都需要运行此命令。可以将其格式化为
    fstab
    ,这样就不需要在每次重新启动时手动执行这些步骤

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

    sudo GOOGLE_APPLICATION_CREDENTIALS=/home/user/credentials/example-asdf21b0af7.json gcsfuse -o allow_other bucket_name /mounted_folder