簡體   English   中英

構建 docker 容器時 gcsfuse 無法掛載

[英]gcsfuse cannot mount when building a docker container

我試圖在docker build期間在我的容器內安裝一個存儲容器。 我已經閱讀了其他線程, herehere並理解這可能是一個特權問題。 可以通過在--privileged docker run進程中添加--privileged標志來解決它,但我想在構建階段立即安裝存儲桶。

連接到容器,檢查fusegcsfuse是否已安裝。 設置了GOOGLE_APPLICATION_CREDENTIALS ,訪問谷歌API沒問題。 這是我得到的錯誤。

Opening GCS connection...
Opening bucket...
Mounting file system...
daemonize.Run: readFromProcess: sub-process: mountWithArgs: mountWithConn: Mount: mount: running fusermount: exit status 1

stderr:
fusermount: fuse device not found, try 'modprobe fuse' first

文件

FROM gcr.io/google-appengine/python
.
.
.
ENV GCSFUSE_REPO=gcsfuse-jessie
RUN apt-get update && apt-get install -y 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

# Config fuse
RUN chmod a+r /etc/fuse.conf
RUN perl -i -pe 's/#user_allow_other/user_allow_other/g' /etc/fuse.conf

# Alter permission
RUN chmod a+w mount-folder

RUN gcsfuse -o --implicit-dirs bucket mount-folder

要使用 gcsfuse 安裝 bucker,您需要使用--privileged標志運行--privileged 現在的問題是,“在這種情況下如何構建一個沒有任何錯誤的 docker 鏡像”? 場景:當在 Dockerfile 中時,您有以下行:

RUN chmod +x launcher.sh
USER ubuntu
RUN mkdir db
RUN gcsfuse mybucket /home/username/mypath
EXPOSE 8000
CMD ["python3.6","manage.py","runmodwsgi"]

你看

Step 8/12 : USER ubuntu
 ---> Running in 0d880396010b
Removing intermediate container 0d880396010b
 ---> 390ed28965e1
Step 9/12 : RUN mkdir mypath
 ---> Running in b1f657562f24
Removing intermediate container b1f657562f24
 ---> 002ca425ac4c
Step 10/12 : RUN gcsfuse mybucket /home/username/mypath
 ---> Running in cae87fd47c1d
Using mount point: /home/username/mypath
Opening GCS connection...
Opening bucket...
Mounting file system...
daemonize.Run: readFromProcess: sub-process: mountWithArgs: mountWithConn: Mount: mount: running fusermount: exit status 1

stderr:
fusermount: fuse device not found, try 'modprobe fuse' first

The command '/bin/sh -c gcsfuse database_simrut /home/ubuntu/db' returned a non-zero code: 1

解決方案:刪除該行

RUN gcsfuse mybucket /home/username/mypath

從 Dockerfile 並創建一個啟動程序腳本,而不是具有以下內容:

#!/bin/bash
gcsfuse mybucket /home/username/mypath
python3.6 manage.py runmodwsgi

你的新 docker 應該是這樣的:

RUN chown $USER:$USER $HOME
RUN chmod +x launcher.sh
USER ubuntu
RUN mkdir db
EXPOSE 8000
CMD ["./launcher.sh"]

輸出:

Step 8/11 : USER ubuntu
 ---> Running in 83c0e73295c2
Removing intermediate container 83c0e73295c2
 ---> fad81733c14d
Step 9/11 : RUN mkdir mypath
 ---> Running in 5d83416f035e
Removing intermediate container 5d83416f035e
 ---> 4575ba28dc44
Step 10/11 : EXPOSE 8000
 ---> Running in 081dc094c046
Removing intermediate container 081dc094c046
 ---> 546c8edd43c3
Step 11/11 : CMD ["./launcher.sh"]
 ---> Running in 6780900e1b2d
Removing intermediate container 6780900e1b2d
 ---> 9ef9fd5af68c
Successfully built 9ef9fd5af68c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM