我正在尝试运行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
答案 0 :(得分:1)
对于遇到类似错误/问题的任何人-这对我有用。我采取的步骤:
sudo umount /mounted_folder
sudo GOOGLE_APPLICATION_CREDENTIALS=/home/user/credentials/example-asdf21b0af7.json gcsfuse -o allow_other bucket_name /mounted_folder
注意:重新启动计算机/ 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用户身份创建文件