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