docker-compose でボリュームを apache イメージにマウントしようとしています。問題は、docker 内の apache は で実行されているwww-data:www-data
のに、マウントされたディレクトリは で作成されることですroot:root
。マウントされたディレクトリのユーザーを指定するにはどうすればよいですか?
コマンドを実行しようとしましたがsetupApacheRights.sh
、chown -R www-data:www-data /var/www
chown: changing ownership of '/var/www/somefile': Permission denied
services:
httpd:
image: apache-image
ports:
- "80:80"
volumes:
- "./:/var/www/app"
links:
- redis
command: /setupApacheRights.sh
マウントするユーザーを指定できるようにしたいのですが、方法はありますか?
ベストアンサー1
ホスト システムの所有者/権限を変更せずに目的の動作を実現するには、次の手順を実行します。
ホスト システムでコマンドを実行して、権限を一致させたい目的のユーザーおよびグループの ID を取得します
id
。これにより、現在のユーザーの uid と gid だけでなく、そのユーザーが属するすべてのグループの ID も表示されます。$ id
docker-compose.ymlに定義を追加します。
user: "${UID}:${GID}"
ファイルは次のようになります
php: # this is my service name user: "${UID}:${GID}" # we added this line to get a specific user / group id image: php:7.3-fpm-alpine # this is my image # and so on
.env
ファイル内の値を設定するUID=1000 GID=1001
3a. あるいは、次のよう~/.bashrc
にファイルを拡張することもできます:
export UID GID
各プロジェクトの .env ファイルで定義するのではなく、グローバルに定義します。これが機能しない場合は (現在のディストリビューションのように、これによって GID が設定されない場合)、次の 2 行を使用します。
export UID=$(id -u)
export GID=$(id -g)
UID / GID をグローバルに定義するための簡単なソリューションを提供してくれた @SteenSchütt に感謝します。
これで、コンテナ内のユーザーの ID は 1000、グループは 1001 となり、環境ごとに異なる設定が可能になります。
注記:私が使用した ID を、ホスト システムで見つかったユーザー / グループ ID に置き換えてください。システムがどの ID を使用しているかはわかりませんので、グループ ID とユーザー ID の例をいくつか示しました。
docker-compose を使用しない場合、またはこれを実現するためのさまざまなアプローチを知りたい場合は、私の情報源を読んでください。https://dev.to/acro5piano/docker-i2e でユーザーとグループを指定する
ボリューム マウント フォルダーがマシン上に存在しない場合は、docker が (ルート ユーザーを使用して) それを作成します。そのため、フォルダーが既に存在し、使用するユーザー ID / グループ ID によって所有されていることを確認してください。
わかりやすく説明するために、dokuwiki コンテナの例を追加します。
version: '3.5'
services:
dokuwiki:
user: "${UID}" # set a specific user id so the container can write in the data dir
image: bitnami/dokuwiki:latest
ports:
- '8080:8080'
volumes:
- '/home/manuel/docker/dokuwiki/data:/bitnami/dokuwiki/'
restart: unless-stopped
expose:
- "8080"
dokuwiki コンテナは、ホスト ディレクトリへの書き込みアクセス権がある場合にのみ、正しく初期化できます/home/manuel/docker/dokuwiki/data
。
起動時にこのディレクトリが存在しない場合は、docker によって作成されますが、ユーザーとグループとして root:root が設定されます。 --> そのため、コンテナの起動は失敗します。
コンテナを起動する前にフォルダを作成すると
mkdir -P /home/manuel/docker/dokuwiki/data
そして確認する
ls -nla /home/manuel/docker/dokuwiki/data| grep ' \.$'
フォルダーの uid と gid を確認し、上記の手順 3 で .env ファイルに入力したものと一致していることを確認します。