ちょっとしたサービスを作りたいと思い、勉強しながらConoHa VPS上でDocker環境を構築中です。
Dockerコンテナとホスト側でvolumeによりファイルを共有したとき、特に何も設定しなければ、コンテナ内で作成したファイルがホスト側でもroot権限で作成されてしまいます。
ホスト側でそのファイルを使うときに不便なので、 ホスト側のユーザIDとグループIDをコンテナ側に共有できないか少し調査しました。
※自分が実装した環境に合わせて、DockerおよびDocker Composeを使った環境を想定した調査となるので注意してください。
目次
ホスト側のユーザIDとグループIDをコンテナ側に設定する方法について調べてみた
いろいろネットで調査しましたが、方法としては以下の3つがあるようでした。
- Dockerfile内にフォルダのユーザIDとグループIDを設定するscriptを入れ込み実行させる
- docker-compose.ymlのuserでユーザIDとグループIDを設定する
- docker-compose.ymlのcommandでフォルダのユーザIDとグループIDを設定するscriptを実行させる
他にもいい方法があるかもしれませんが、Docker初心者の自分としては思いつきませんでした。。。
何かいい方法をご存じでしたら教えてください。
簡単にそれぞれの方法について調べました。
方法1「Dockerfile内にフォルダのユーザIDとグループIDを設定するscriptを入れ込み実行させる」
- DockerfileはDocker imageに書き込むことができるので、コンテナに依存しないデフォルトユーザとグループを設定できる。
- Dockerfileは.envなどの環境変数を定義したファイルから環境変数を定義することができないみたい。
※docker build
コマンドの--build-arg
オプションを使ってコマンドの引数として環境変数を定義する方法があったが、環境変数が多くなるにつれてコマンドが長くなる。
方法2「docker-compose.ymlのuserでユーザIDとグループIDを設定する」
- docker-compose.ymlで
user: ユーザID:グループID
を定義したうえで、docker-compose up
コマンドを実行すると、設定したユーザ/グループでコンテナを起動できる。 - スクリプトを作る必要がないので、3つの案の中で一番簡単に設定できる。
- コンテナ内にホスト側のユーザIDとグループIDがなくても無理やり起動させようとするため予期せぬエラーが発生しそう。
- コンテナ内でroot権限を使いたくなった場合、どうするのか不明。
方法3「docker-compose.ymlのcommandでフォルダのユーザIDとグループIDを設定するscriptを実行させる」
- docker-composeの
env_file
やenvironment
を利用してホスト側の環境変数をコンテナ側に注入できる。 - コンテナが生成された後のscript実行でユーザID/グループIDを定義するため、コンテナごとに設定できる。
- scriptで実行するユーザIDやグループIDを設定する
useradd
やgroupadd
コマンドはroot権限でしか使えないため、初回コンテナ生成時はrootユーザで起動が必要。 - コンテナ内でユーザIDとグループIDを設定できたら、それ以降は
docker-compose up -u ユーザ名
、docker exec -u ユーザ名
でユーザIDを指定してコンテナを起動できる。
どの方法がよいでしょう?
やりたいことによって、どの方法が良いかは変わってくると思います。
root権限があまり必要ないのなら、導入が簡単な方法2「docker-compose.ymlのuserでユーザIDとグループIDを設定する」がいい気がします。
root権限が必要で、ユーザIDやグループIDを環境変数で定義せず、固定で行うのなら、方法1「Dockerfile内にフォルダのユーザIDとグループIDを設定するscriptを入れ込み実行させる」が、コンテナ依存しないで定義できるのでいいのではないでしょうか。
自分はroot権限が必要で、ユーザIDやグループIDを環境変数で定義したかったので、方法3「docker-compose.ymlのcommandでフォルダのユーザIDとグループIDを設定するscriptを実行させる」を採用することにしました。
コンテナの初回起動時はroot権限で立ち上げる必要がありますが、それ以降は-u
オプションでユーザ指定して起動することを徹底すれば、それほど労力なく実装できそうです。
以下のブログで方法3「docker-compose.ymlのcommandでフォルダのユーザIDとグループIDを設定するscriptを実行させる」方法をまとめたので、よろしければご覧になってください。
関連情報
ConoHa上でDockerを導入したり、Webアプリを立ち上げたりした内容を以下の記事でまとめました。こちらもよろしければご覧になってください。
広告
Dockerをやるなら以下の書籍がオススメです。
Dockerとは何か?から複数のコンテナを管理することができるDocker Compose、Kubernetesまでまとめられています。
ConoHa VPS
は初期費用不要で月に数百円で利用できる仮想サーバのサービスです。以下のような方には非常にオススメのサービスとなっています!
- 勉強がてらLinuxの環境をちょっと触ってみたい
⇒管理者権限が実行可能なLinuxサーバ環境が構築可能です! - スモールスタートでサービスを提供して、うまくいったら規模をスケールアップしたい
⇒後からメモリサイズやCPU数などのスケールアップ/スケールダウン可能です! - AWSやGCPなどのクラウドサービスは高いので、もっと安くサーバ構築したい
⇒初期費用なし、月数百円(1時間単位も可)で利用可能です!
以上!
コメント