gcsfuse를 사용하여 AppEngine Flexible Environment 앱에 GCS 버킷을 마운트하려고합니다.App Engine의 유연한 환경에 GCS 버킷 장착
# 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에서이 대부분을했다 :
내 Dockerfiles에는 다음이 포함됩니다. 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
에서 하위 프로세스를 실행하는 경우), I 사용자 루트를 생각하든 방법
[pid 59] open("/dev/fuse", O_RDWR) = -1 EPERM (Operation not permitted)
. export
을 실행하면 다른 변수가 표시되므로 실행중인 항목에 차이가 있지만 다른 모든 항목은 저에게 동일하게 보입니다.
다른 제안들 gcsfuse 플래그 -o allow_other
및 -o allow_root
을 사용하는 것이 좋습니다. 이들은 작동하지 않았다.
gcsfuse
을 실행할 수없는 로그인에서 umount
을 실행하려고하면 루트인데도 "must be superuser to unmount"
이라고 표시된다는 사실에 실마리가 있습니다.
내가 이해하지 못하는 보안 설정이있는 것 같습니다. 그러나, 이론적으로는 main.py
이 외부 프로그램을 실행하여 로그인하고 gcsfuse
을 실행하면 그 일을하지 않고도 작동하도록 할 수있는 것처럼 보입니다.
감사합니다. 나는이 아이디어를 시도했다. 진입 점이 나를 위해 작동하지 않았습니다 (gcsfuse 명령을 실행하고 & gunicorn). sudo가 발견되지 않았기 때문에 파이썬 서브 프로세스에서 sudo를 호출하려고 시도하지 않았습니다 (사용자는 어쨌든 루트입니다). 주요한 미스테리는 인스턴스에 대한 sshing과 container_exec (gcsfuse works)와 sshing (gaeapp (gcsfuse 실패)) 사이의 차이입니다. – hgbrian