1

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을 실행하면 그 일을하지 않고도 작동하도록 할 수있는 것처럼 보입니다.

답변

0

실행 명령은 dockerfile에 대한 새 레이어를 만드는 것이므로 실제로 이미지를 만드는 동안 해당 명령을 실행하고 있습니다. 따라서 Flex 빌드 시스템에서는이 명령을 사용하지 않습니다.

나는 응용 프로그램에서 지불 한 것은, 당신이 ''파이썬 하위 프로세스에서이를 sudo'ing, 또는 가능하게 추가하여 응용 프로그램 코드에서 밀어 '시도 gcsfuse 설정 & &를 수 작동하지 않았다 왜 안 확신 dockerfile의 ENTRYPOINT에 추가하십시오.

+0

감사합니다. 나는이 아이디어를 시도했다. 진입 점이 나를 위해 작동하지 않았습니다 (gcsfuse 명령을 실행하고 & gunicorn). sudo가 발견되지 않았기 때문에 파이썬 서브 프로세스에서 sudo를 호출하려고 시도하지 않았습니다 (사용자는 어쨌든 루트입니다). 주요한 미스테리는 인스턴스에 대한 sshing과 container_exec (gcsfuse works)와 sshing (gaeapp (gcsfuse 실패)) 사이의 차이입니다. – hgbrian