2017-12-18 33 views
0

내 컨테이너를 실행하는 데 dockerdocker-compose을 사용합니다. 두 서비스 - celerybeatweb 중 하나 (다른 서비스가 있지만 내 문제가 있기 때문에이 서비스 만 고려함)가 있습니다.도커의 공유 이미지 볼륨 탑재 오류

docker-compose.yml 파일은 다음과 같습니다 :

에서
. 
. 
. 

celerybeat: 
    image: web-image 
    volumes: 
    - /home/ubuntu/celerybeat:/code/celerybeat 
    command: > 
    /bin/ash -c "su -m celery -c 'celery -A <application_here> beat -s /code/celerybeat/celerybeat-schedule'" 

web: 
    image: web-image 
    volumes: 
    - /home/ubuntu/celerybeat:/code/celerybeat 
    command: >  
    <some_command_to_run_server> 

Dockerfile 나는 적절한 권한

RUN mkdir celerybeat 
RUN touch celerybeat/celerybeat-schedule 
RUN chown -R celery:celery celerybeat 

참고 이러한 명령을 추가 한 : 내 작성 파일 구조에서 나는 볼륨 마운트를 제공 한 위 기록 두 컨테이너 모두 (실제로는 한 번에 하나씩 사용하고 있습니다.) 다시 작성 파일을 작성하지 않으려면을 사용하십시오.

문제는 실제로 여기에만 있습니다. 기술적으로 볼륨 탑재는 셀리 비트 서비스에서만 제공되어야합니다. 셀 룰 비트 도커 서비스에서 celerybeat-schedule의 볼륨 마운트를 쓸 때 permission denied이됩니다. 반면에 웹 서비스에서 볼륨 마운트 명령을 작성할 때 celerybeat 서비스가 행복하게 시작됩니다. 아무도 나에게 설명 할 수있는 일이 여기 무엇입니까? 나는 이것을 위해 수정이 필요하다.

+0

웹 서비스 celerybeat 서비스에서 볼륨 마운트 명령을 쓰고 행복하게 시작한다고 말하면 정확히 실행중인 명령은 무엇입니까? – bluescores

+0

그래도이 문제를 이해할 수는 없지만 문제가 해결되었습니다. 문제는 내가 샐러리 사용자로 비트 서비스를 시작하라는 명령을 실행하고 있다는 것이 었습니다.그러나'su -m celery -c' 비트를 추가하지 않고 서비스를 시작했을 때 작동했습니다. 이 문제가 발생하는 이유는 무엇입니까? –

답변

1

순서대로 다음 사용하지 않는 중 하나입니다 -. docker build 다음 docker run (A docker run로 계산 docker-compose up

볼륨을 마운트 할 때, 파일 볼륨을 마운트하지 않으면 RUN chown -R celery:celery celerybeat을 사용할 수 있습니다. docker run/docker-compose up에 볼륨을 마운트하면 사용 권한을 포함하여/code/celerybeat에있는 모든 항목을 덮어 씁니다.

그래서 루트로 셀리 비트를 실행할 때,이 경우에는 훌륭합니다. 시도한대로 셀러리 사용자로 실행하면 바인드 마운트 볼륨으로 루트에 소유되기 때문에 해당 사용자는/code/celerybeat에 액세스 할 수 없습니다.

Dockerfile의 chown 디렉토리 대신 엔트리 포인트 스크립트의 일부로 chown을 실행하십시오. 비슷해 : RUN chown -R celery:celery celerybeat 마운트 바인드 전에 실행하고, 그것에 의해 덮어 쓰기된다

#!/bin/bash 

chown -R celery:celery celerybeat 
/bin/ash -c "su -m celery -c 'celery -A <application_here> beat -s /code/celerybeat/celerybeat-schedule'" 

이 스크립트, 이에 대한 Chown 바인드 마운트 후 을 실행한다.

2

당신이 가진 문제는 위의 볼륨 매핑을함으로써

volumes: 
    - /home/ubuntu/celerybeat:/code/celerybeat 

아래에, 당신은 효과적으로 아래

RUN chown -R celery:celery celerybeat 

을 취소하고 볼륨에서 권한 장착을 상속합니다. 수정은 셀러리 사용자를 사용하거나 YAML 작업의

command: > 
    /bin/ash -c "chown -R celery:celery /code/celerybeat && su -m celery -c 'celery -A <application_here> beat -s /code/celerybeat/celerybeat-schedule'" 
+0

감사합니다 Tarun! :), 동일한 대답, 그에게 upvote 준 "왜냐하면"부의 분배 " –