Docker-compose マウントされたボリュームにユーザーとグループを設定する 質問する

Docker-compose マウントされたボリュームにユーザーとグループを設定する 質問する

docker-compose でボリュームを apache イメージにマウントしようとしています。問題は、docker 内の apache は で実行されているwww-data:www-dataのに、マウントされたディレクトリは で作成されることですroot:root。マウントされたディレクトリのユーザーを指定するにはどうすればよいですか?

コマンドを実行しようとしましたがsetupApacheRights.shchown -R www-data:www-data /var/wwwchown: 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

ホスト システムの所有者/権限を変更せずに目的の動作を実現するには、次の手順を実行します。

  1. ホスト システムでコマンドを実行して、権限を一致させたい目的のユーザーおよびグループの ID を取得しますid。これにより、現在のユーザーの uid と gid だけでなく、そのユーザーが属するすべてのグループの ID も表示されます。

     $ id
    
  2. 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
    
  3. .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 ファイルに入力したものと一致していることを確認します。

おすすめ記事