Dockerコンテナ・ホスト間のフォルダ権限管理を改善

当サイトではDocker-composeを使用したコンテナ連携記事を掲載していますがコンテナにマウントしているデータボリュームの権限を適切に設定しないとWordpressでメディアファイルをアップロード出来ない、Wordpressの対話式アップデートに失敗する等の課題がありました。簡単な解決策は、ディレクトリのパーミッションを777に設定することです。しかしこれは外部からアクセスの無いローカルのテスト環境でしか推奨できません。今回の記事では上記課題の別解決策を紹介します。

1.別解概要

ホストとDockerコンテナ間で共通のユーザ―IDを持つユーザーを作成します。ユーザーIDが共通のユーザーはホストとコンテナで別空間であってもマウントしたフォルダの権限は相互にユーザーIDを基に管理されるようになります。

例えばホストでユーザ―ID=100を持つユーザーが作成したファイルは別コンテナの ユーザ―ID=100を持つユーザーからも自分が作成したファイルとして扱えるとことになります。この特性を使用すればマウントフォルダの権限を777に変更せずに特定(共通ユーザーID)ユーザ―の所有ファイルとして管理できます。

2.現在のコンテナ概要

ベースとするのは、こちらの記事「Docker-Composeでnginx,php,mysqlの3コンテナを連携する 」になります。

(1)コンテナ構成図

上記のようにホストのWWW/dataフォルダを「Nginxコンテナ」と「php7コンテナ」からデータボリュームコンテナを通してマウントしています。このフォルダにWordpressをはじめとするコンテンツファイルが入りますが当フォルダにホストユーザーの所有権を設定しているとWordpressからファイルがアップロード出来ない等の課題がありました。

(2)フォルダ構成

(3)docker-compose.yml

3.目標とするコンテナ概要
(1)コンテナ構成図

(2)修正点
  • ホスト側で、UID=1000,GID=1000のユーザ:nginx_dockerを作成します。マウントディレクトリの所有権はnginx_dockerに設定します。
  • nginxコンテナ、php7コンテナでUID=1000,GID=1000のユーザ:nginx_dockerを作成します。
  • nginxコンテナでnginxサービスの起動ユーザーをnginx_dockerに変更します。
  • php7コンテナでphp-fpmサービスの起動ユーザーをnginx_dockerに変更します。
4.ホスト・コンテナ設定手順
(1)ホストの設定

以下の通りグループ・ユーザーを作成します。

マウントディレクトリ権限を変更します。

(2)Nginxコンテナ設定

・nginx/Dockerfile

グループ・ユーザーを作成するコマンドとnginxをnginx_dockerで起動する為にnginx.confのnginxをnginx_dockerに置換するsedコマンドを登録します。

(3)php7コンテナ設定

・php7/Dockerfile

グループ・ユーザーを作成するコマンドを登録します。

・php7/www.conf

php-fpmをnginx_dockerで起動する設定を追加します。

(4)docker-compose.yml

以下の差分を追加します。php7コンテナでwww.confをマウントする設定です。

(5)コンテナ再起動

起動中のコンテナを停止し、Buildオプションを付加して再起動します。

既存のイメージは新たにBuildされたイメージで置換され設定ファイルが反映された状態で起動します。

5.参考にさせて頂いたサイト

Concrete5 on Nginx + php7-fpm を docker-compose でやってみた

Dockerコンテナ内のユーザとホストのユーザとの関係について

ありがとうございます。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする