1

gcsfuseを使用してAppEngine Flexible EnvironmentアプリにGCSバケットをマウントしようとしています。App Engineのフレキシブル環境にGCSバケットを取り付ける

私Dockerfilesには次のものが含まれます。

# gscfuse setup 
RUN echo "deb http://packages.cloud.google.com/apt cloud-sdk-jessie main" | tee /etc/apt/sources.list.d/google-cloud.sdk.list 
RUN echo "deb http://packages.cloud.google.com/apt gcsfuse-jessie main" | tee /etc/apt/sources.list.d/gcsfuse.list 
RUN wget -qO- https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - 
RUN apt-get update && apt-get install -y --no-install-recommends google-cloud-sdk gcsfuse strace 
RUN gcsfuse --implicit-dirs my_bucket my_dir 

私はhereからこれのほとんどを取りました。これはgcsfuseをインストールするための標準的な方法です。--no-install-recommendsです。

この方法でアプリケーションを起動すると、ドライブがマウントされません。私にとってあまり驚くべきことではありませんでした。柔軟な環境のサポートされている機能のようには見えなかったからです。

ここは混乱する部分です。 gcloud app instances ssh "<instance>"を実行してcontainer_exec gaeapp /bin/bashを実行すると、gcsfuse my_bucket my_dirが正常に動作します。私はgcloud app instances ssh "<instance>" --container gaeappを実行する場合

はしかし、その後、gcsfuse my_bucket my_dirは、このエラーで失敗します。

fusermount: failed to open /dev/fuse: Operation not permitted 

これは私が私のmain.pyでサブプロセスとしてgcsfuseを実行する場合、私が得る同じエラーです。

このunresolved threadに基づいて、私はstrace -fを実行し、EPERMの問題であるユーザーとまったく同じ問題を発見しました。私はコンテナにログイン(または私はmain.pyからサブプロセスを実行する場合)、私はrootユーザーを午前どちらの方法

[pid 59] open("/dev/fuse", O_RDWR) = -1 EPERM (Operation not permitted) 

。私がexportを実行すると、異なるvarsが表示されるので、何が実行されているかにいくつかの違いがありますが、それ以外のものはすべて私に似ています。

私が見た他の提案は、gcsfuseフラグ-o allow_other-o allow_rootを使用しています。これらは機能しませんでした。

gcsfuseを実行できないログインでumountを実行しようとすると、私がrootになっていても"must be superuser to unmount"と表示されているということには手がかりがあるかもしれません。

おそらく、私が理解していないセキュリティ設定があるようです。しかし、理論的には、外部プログラムを起動してgcsfuseを実行すると、理論的にはmain.pyを得ることができたので、それをすることなく動作させる方法があるはずです。

答えて

0

RUNコマンドは、dockerfileの新しいレイヤーを作成するためのものです。実際には、イメージの作成中にそのコマンドを実行しています。これはFlexビルドシステムでは嫌いです。

私はアプリケーションに砲撃が機能しなかった理由を、あなたが試みることができるか分からない「Pythonのサブプロセスでそれをsudo'ing、または可能性追加することによって、アプリケーションコードからそれをプッシュする 『』 gcsfuseセットアップ& &をドッカーファイルのENTRYPOINTに設定します。

+0

ありがとうございました。私はこれらのアイデアを試した。エントリーポイントは私のためには機能しませんでした(gcsfuseコマンド&& gunicornを実行しています)。 sudoが見つからなかったため、pythonサブプロセスからsudoを呼び出そうとしましたが(ユーザはrootです)私の主な謎は、インスタンスへのsshingと、container_exec(gcsfuse works)とsshingと--container gaeapp(gcsfuse fail)の実行の違いです。 – hgbrian

関連する問題