[Docker]volumesのパスがアプリを読み込む範囲だと知らなかった
docker-compose.ymlのvolumes設定について✐
■volumesのこと
ボリュームの一番の役割はデータの永続化ができること。
dockerコンテナはデータをコンテナ内に残すことはできないのでコンテナ削除するときにデータも消えてしまう。
そこで、ボリュームを設定してコンテナ起動時にローカルにあるデータをコンテナ内に取り入れてデータを保持しているように扱える。
volumes:
- ./var/www/html:/var/www/html
左辺の「./var/www/html:」はローカルのフォルダパス(アプリのフォルダ)
右辺の「/var/www/html」は左辺のローカルファイルをコピーするコンテナ内のファイルのパス
<ディレクトリ構成>
ワークスペース
├── Dockerfile
| ├── www/index.php
| └── admin/index.php
|
├── mysql
│ └── 20241001.sql
├── php
│ └── php.ini
└── var
| └── www
| └── html
| └──work
| └──index.php #← 最初に読み込まれたいファイル(ドキュメントルート)
|
└── docker-compose.yml
■volumesとドキュメントルート
volumes=ドキュメントルートと等しいと思っていたけど違った。
はじめに
ドキュメントルートの設定せずボリュームを設定した場合は、
ボリュームに記載したパスがドキュメントルートとして認識される。
!問題点
今回のディレクトリ構成は上記のようになっていて、
ドキュメントルートはvar/www/html/work
になる。
でも、ドキュメントルートより上の階層(var/www/html
)のファイルも読み込む必要があった。
しかし、コンテナはボリュームに記載したディレクトリ以下のファイルのみ読むことができる。
なので、ボリュームで- ./var/www/html/work:/var/www/html
と設定すると、
上の階層のvar/www/html
ディレクトリにあるファイルを読み込まないのでエラーになってしまう。
そのため、ボリュームでは- ./var/www/html:/var/www/html
と設定して、
読み込みたいファイルを全て網羅したパスを設定して、
ドキュメントルートは別に設定することで解決する。
■ドキュメントルートの設定
ドキュメントルートの設定せずボリュームを設定した場合は、
ボリュームに記載したパスがドキュメントルートとして認識されるので、
このままではindex.phpが読み込まれない。
なので別途でドキュメントルートをDockerfileで設定する。
ENV APACHE_DOCUMENT_ROOT /var/www/html/dev.wellness-s.xyz/www/
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
# ↑apacheのconfファイルに対して、ドキュメントルートを設定するというコマンド
また、ymlでbuildを設定して(build:Dockerfileのパス
)Dockerfileを読み込むようにする。これで解決🙆🏻♂️
services:
php:
image: php:7.4.29-apache
build: ./dockerfiles/www
プラスの問題
今回は、ymlで2つのPHPコンテナ(1つのDBを共有する2つのWebサイト)を設定していて、
この2つのコンテナで異なるドキュメントルートを設定する必要があった。
この場合上記の処理だけだと、一方のドキュメントルートしかマウントされず、
8080ポートでも、8081ポートでも同じブラウザ画面が表示されてしまって詰まった。
→ 解決方法
上記の処理に加えて、ymlにenvironment:
を設定して以下のようにそれぞれのコンテナに対してドキュメントルートを設定することで解決できる🙆🏻♂️
services:
php:
image: php:7.4.29-apache
build: ./dockerfiles/www
environment:
- APACHE_DOCUMENT_ROOT=/var/www/html/work
Discussion