🤖

[Docker]volumesのパスがアプリを読み込む範囲だと知らなかった

2024/10/21に公開

docker-compose.ymlのvolumes設定について✐

■volumesのこと

ボリュームの一番の役割はデータの永続化ができること。
dockerコンテナはデータをコンテナ内に残すことはできないのでコンテナ削除するときにデータも消えてしまう。
そこで、ボリュームを設定してコンテナ起動時にローカルにあるデータをコンテナ内に取り入れてデータを保持しているように扱える。

docker-compose.yml
    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を読み込むようにする。これで解決🙆🏻‍♂️

yml
services:
  php:
    image: php:7.4.29-apache
    build: ./dockerfiles/www

プラスの問題
今回は、ymlで2つのPHPコンテナ(1つのDBを共有する2つのWebサイト)を設定していて、
この2つのコンテナで異なるドキュメントルートを設定する必要があった。
この場合上記の処理だけだと、一方のドキュメントルートしかマウントされず、
8080ポートでも、8081ポートでも同じブラウザ画面が表示されてしまって詰まった。

→ 解決方法
上記の処理に加えて、ymlにenvironment:を設定して以下のようにそれぞれのコンテナに対してドキュメントルートを設定することで解決できる🙆🏻‍♂️

docker-compose.yml
services:
  php:
    image: php:7.4.29-apache
    build: ./dockerfiles/www
    environment:
        - APACHE_DOCUMENT_ROOT=/var/www/html/work

Discussion