2016-09-08 19 views
2

Dockerコンテナでroot以外のユーザーとしてアプリケーションを実行しています。これはベストプラクティスの1つなので、私はこれを行いました。ただし、コンテナを実行している間はホストボリュームを-v /some/folder:/some/folderにマウントします。ドッカーコンテナ内で実行されているアプリケーションがマウントされたホストフォルダにファイルを書き込む必要があるため、これを実行しています。私はroot以外のユーザーとして自分のアプリケーションを実行しておりますので、それはそのフォルダへの書き込み権限を持っていない。しかしホストにマウントされたボリュームへのDockerコンテナの非ルートユーザーへのアクセス方法

質問

はそれがにドッキングウィンドウコンテナへのアクセスにroot以外のユーザーに付与することができますホストされたボリューム?

もしそうでなければ、ドッカーのコンテナでプロセスをrootとして実行する唯一の方法はありますか?

答えて

2

ここでは魔法の解決策はありません。ドッカー内の権限は、ドッカーなしの権限と同じように管理されます。適切なchownおよびchmodコマンドを実行して、ディレクトリのアクセス権を変更する必要があります。

コンテナをrootとして実行し、ENTRYPOINTスクリプトを使用して適切な権限を変更し、次に特権のないユーザーとしてCMDを使用することです。例えば、entrypoint.shに次のように置く:

#!/bin/sh 

chown -R appuser:appgroup /path/to/volume 
exec runuser -u appuser "[email protected]" 

をこれは、あなたが利用可能runuserコマンドを前提としています。代わりにsudoを使用して、ほぼ同じことを達成できます。

はあなたのDockerfileでENTRYPOINTディレクティブを含むことにより、上記のスクリプトを使用します。

FROM baseimage 

COPY entrypoint.sh /entrypoint.sh 
ENTRYPOINT ["/bin/sh", "entrypoint.sh"] 
CMD ["/usr/bin/myapp"] 

これはでコンテナを起動します:

/bin/sh entrypoint.sh /usr/bin/myapp 

エントリポイントスクリプトを実行し、必要な権限の変更を行います/usr/bin/myappappuserとする。

appuser$ id 

これを、あなたのコンテナ内部

実行します。

+0

これはうまくいくと思います。これをもっと一般的にするために、 '/ path/to/volume'を' -v'コマンドに与えられたパラメータで置き換える方法がありますか?たとえば、コンテナが '-v/some/path:/ some/path'で実行されている場合、entrypoint.shの' chown'コマンドは 'chown -R appeaser:appuser/some/path'になります。 entrypoint.shのボリューム名をハードコーディングするのではなく – Anthony

+0

利用可能なボリュームパスをイントロスペクトする方法はありませんが、環境変数( 'docker run -v/some/path:/ some/path -e MYVOLUME =/some/path ... ')、' ENTRYPOINT'スクリプトで '$ MYVOLUME'を使います。 – larsks

+0

ugh。 'runuser'が見つかりませんでした。どうすればそのコマンドを入手できますか?私はubuntuイメージを使用しています。 – Anthony

1

あり、ホストENVがappuserappgroupを持っていない場合は代わりに、ユーザー名のユーザーIDを使用するので、より良いエラーがスローされます

uid = 1000(appuser)gid = 1000(appuser)groups = 1000(appuser)

ホストENVから、次のコマンドを実行します

mkdir -p /some/folder 
chown -R 1000:1000 /some/folder 
docker run -v /some/folder:/some/folder [your_container] 

をごコンテナの内側に、それはrootがない場合

ls -lh 

は、ユーザーとグループ名を確認するためにチェックし、それが働いていたはずですです。

関連する問題