2017-12-18 7 views
0

私はdockerで自分のコンテナを実行するのにdocker-composeを使用します。私は2つのサービスを持っています:celerybeatwebの1つ(私は多くの人がいますが、私の問題があるのでこれらのサービスだけを考えています)。ドッカーの共有イメージボリュームのマウントエラー

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私は、適切なアクセス許可

注のためにこれらのコマンドを追加しました:私のコンファイル構造では、私はボリュームのマウントを提供してきた上に書かれました両方のコンテナ(ただし、実際には私は一度に1つずつ使用しています)を使用して、何度でも作成ファイルを書き込まないようにします。

問題は実際にはここだけです。技術的には、ボリュームマウントはセロリビートサービスでのみ提供する必要があります。セルフリービートドッカーサービスでcelerybeat-scheduleのボリュームマウントを書くと、permission deniedとなります。一方、Webサービスでボリュームマウントコマンドを書くと、celerybeatサービスがうまく始まります。誰も私を説明することができますここで何が起こっている?私はこれのための修正が必要です。

+0

Webサービスのcelerybeatサービスでボリュームマウントコマンドを記述すると、うまく起動すると、どのコマンドが正確に実行されていますか? – bluescores

+0

私はまだこれを理解することはできませんが、問題を修正しました。問題は、私がセロリのユーザーとしてビートサービスを開始するコマンドを実行していたことでした。しかし、 'su -m celery -c'ビットを追加せずにサービスを開始したとき、それはうまくいった。なぜこの問題が発生していますか? –

答えて

1

順に以下を使用することではないのいずれかである - 。docker buildその後、docker rundocker runとしてカウントdocker-compose up

ボリュームをマウントすると、ファイルdocker run/docker-compose upにボリュームをマウントすると、パーミッションを含めて/ code/celerybeatに存在するものがすべて上書きされます。

それでは、rootとしてcelerybeatを実行すると、この場合は良い状態になります。試したときにセロリー・ユーザーとして実行すると、そのユーザーはバインド・マウント・ボリュームとしてrootによって所有されているため、/ code/celerybeatにアクセスすることはできません。

Dockerfile内のディレクトリをchownにする代わりに、エントリポイントスクリプトの一部としてchownを実行してください。ような何か:

#!/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、バインドマウント後を実行し、RUN chown -R celery:celery celerybeat前にバインドマウントを実行し、それによって上書きされます。

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を与えたので、 "富の分布" –

関連する問題