使用gcsfuse挂载谷歌存储时,Docker构build失败

我一直在试图安装SQL和一个存储桶到我的docker的WordPress容器。 它似乎成功安装SQL,但未能安装存储桶。 实例是基于这篇文章 。

我已经附加了Docker文件和错误,以及我的生成命令。

构build命令:

docker build -t ic/spm .

Dockerfile:

 FROM wordpress MAINTAINER Gareth Williams <gareth@itinerateconsulting.com> # Move login creds locally ADD ./creds.json /creds.json # install sudo, wget and gcsfuse ENV GCSFUSE_REPO=gcsfuse-jessie RUN apt-get update && \ apt-get -y install sudo && \ apt-get install -y curl ca-certificates && \ echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" > /etc/apt/sources.list.d/gcsfuse.list && \ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \ apt-get update && \ apt-get install -y gcsfuse wget && \ apt-get remove -y curl --purge && \ apt-get autoremove -y && \ rm -rf /var/lib/apt/lists/* # Config fuse RUN chmod a+r /etc/fuse.conf RUN perl -i -pe 's/#user_allow_other/user_allow_other/g' /etc/fuse.conf # Setup sql proxy RUN sudo mkdir /cloudsql RUN sudo chmod 777 /cloudsql ADD https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 cloud_sql_proxy.linux.amd64 RUN mv cloud_sql_proxy.linux.amd64 cloud_sql_proxy && chmod +x ./cloud_sql_proxy RUN ./cloud_sql_proxy -dir=/cloudsql -fuse -credential_file=/creds.json & # mysql -u icroot -S /cloudsql/[INSTANCE_CONNECTION_NAME] # Perform Cloud Storage FUSE mounting for uploads folder RUN mkdir /mnt/uploads RUN chmod a+w /mnt/uploads #RUN chown www-data:www-data -R /mnt && groupadd fuse && gpasswd -a www-data fuse && chmod g+rw /dev/fuse USER www-data RUN gcsfuse --key-file /creds.json \ --debug_gcs --debug_http --debug_fuse --debug_invariants \ --dir-mode "777" -o allow_other spm-bucket /mnt/uploads 

错误:

 Step 17 : RUN gcsfuse --key-file /creds.json --foreground --debug_gcs --debug_http --debug_fuse --debug_invariants --dir-mode "777" -o allow_other spm-bucket /mnt/uploads ---> Running in 7e3f31221bee Using mount point: /mnt/uploads Opening GCS connection... Opening bucket... gcs: Req 0x0: <- ListObjects() http: ========== REQUEST: GET http://www.googleapis.com/storage/v1/b/spm-bucket/o?maxResults=1&projection=full HTTP/1.1 Host: www.googleapis.com User-Agent: gcsfuse/0.0 Authorization: Bearer ya29.ElrQAw8oxClKt8YGvtmxhc7z2Y2LufvL0fBueq1UESjYYjRrdxukNTQqO1qfM8e8h-rqfbOWNSjVK2rCRXVrEDla-CiUVhHwT6X71Y1Djb0jDJg7z3KblgNQPrc Accept-Encoding: gzip http: ========== RESPONSE: HTTP/2.0 200 OK Content-Length: 31 Alt-Svc: quic=":443"; ma=2592000; v="35,34" Cache-Control: private, max-age=0, must-revalidate, no-transform Content-Type: application/json; charset=UTF-8 Date: Wed, 11 Jan 2017 09:19:05 GMT Expires: Wed, 11 Jan 2017 09:19:05 GMT Server: UploadServer Vary: Origin Vary: X-Origin X-Guploader-Uploadid: AEnB2UpTqXhtHW906FFDTRsz4FjHjFu_E84wYhvt0zhaVFuMpqSY1fsd1XcrEcpsYBBwX1mqf0ZXRVWJH05ThtDQIfFKHd4PFw { "kind": "storage#objects" } http: ==================== gcs: Req 0x0: -> ListObjects() (1.793169206s): OK Mounting file system... mountWithArgs: mountWithConn: Mount: mount: running fusermount: exit status 1 stderr: fusermount: failed to open /dev/fuse: Operation not permitted 

如果你正在GKE上运行你的容器,并且你想使用gcsfuse,那么权限应该自动在你的账户中被本地inheritance。 另外…有一个警告,你需要确保你的运行集群需要存储访问。 因此,请确保您的群集具有设置为完全访问权限的存储权限。 这样gcsfuse就可以在容器中的GCS上安装你的桶,而不必担心传递凭证文件和所有这些东西……使得实现非常简单。

在您的docker文件中…确保您正在执行apt命令来获取和安装gcsfuse应用程序。

我个人做了一个shell脚本,一旦实例启动,我就调用它,挂载我需要的目录。

像这样的东西…

Docker条目

ENTRYPOINT ["/opt/entry.sh"]

entry.sh脚本示例

gcsfuse [gcs bucket name] [local folder to mount as]

在生成GKE集群时,请确保添加存储范围

gcloud container clusters create [your cluster name] --scopes storage-full

希望这可以帮助你。

你的www数据在dockerfile中有权限问题:

 #RUN chown www-data:www-data -R /mnt && groupadd fuse && gpasswd -a www-data fuse && chmod g+rw /dev/fuse 

取消注释这一行