在Google云实例上运行Docker,数据位于gcsfuse挂载的Bucket中
我试图运行一个Docker容器来分析Google云存储桶中的数据 我已经能够使用在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
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文件夹
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