2018-08-29

tobijibu

DockerのApacheでシンボリックリンク表示でつまづく

DockerのApache(phpのコンテナイメージ含まれているApache)で、 FollowSymLinksを設定しているにも関わらず、シンボリックリンクを辿れないという状態になりました。 検証用にサクッと立ち上げるつもりが随分と時間が掛かってしまいました。 結局ただの設定ミスだったのですが、忘れないためにも書いておこうと思います。

結論としてはDockerにマウントされる状態をイメージしてシンボリックリンクを設定するということです。


環境
Host : Windows7 Virtualbox + Vagrant
Guest : CentOS 7.5
ゲストにDockerを載せて動かします。


構成

ディレクトリは以下のようになっています。 あらかじめ000-default.confを作成しておきました。

docker
|-- config
|   |-- 000-default.conf
|   `-- Dockerfile
`-- docker-compose.yml

そして以下が各ファイルの内容です。

docker-compose.yml
apache-php:
    build: ./config
    ports:
        - "80:80"
    volumes:
        - ~/projects:/var/www/html
Dockerfile
FROM php:7.2-apache
COPY ./000-default.conf /etc/apache2/sites-available/000-default.conf
000-default.conf
<VirtualHost *:80>
    DocumentRoot /var/www/html
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

~/projects以下のディレクトリ構造は以下になっています。

~/projects
|-- test
|   |-- cat
|   |-- dog
|   `-- ...
`-- test_page
    |-- cat -> /home/vagrant/projects/test/cat/dist
    |-- dog -> /home/vagrant/projects/test/dog/dist
    `-- ...

ブラウザでアクセス

上記のような構成でブラウザからhttp://(localhost)/dogs/にアクセスしたところ403エラーが発生しました。 シンボリックリンクが認識されていないようです。 http://(localhost)/にアクセスしてもディレクトリインデックスに対象のディレクトリが表示されません。

そこでapacheコンテナの/var/www/htmlはどうなっているかを確認しました。 怪しいですね。

$ docker-compose exec apache-php bash
root@44fb03a9a30d:/var/www/html# ls -la ./test_page
total 0
drwxr-xr-x. 2 1000 1000 20 Aug 28 11:49 .
drwxr-xr-x. 4 1000 1000 71 Aug 28 11:15 ..
lrwxrwxrwx  1 1000 1000 20 Aug 28 11:49 cats -> /home/vagrant/projects/test/cats/dist <- これ
lrwxrwxrwx  1 1000 1000 20 Aug 28 11:49 dogs -> /home/vagrant/projects/test/dogs/dist <- これ
...

シンボリックリンクのリンク先がvagrant上のパスになっています。 Apacheコンテナにはそんなディレクトリは存在しないので表示できず、ディレクトリインデックスにも表示されないという状態になっていました。

ここまで分かってしまえばあとは簡単です。シンボリックリンクを相対パスで指定すれば良さそうです。

$ cd ~/projects/test_page
$ unlink cats
$ ln -s ../test/cats/dist cats
...

シンボリックリンクを生成しなおして確認してみると、正しいリンクになります。 そしてブラウザでも確認できるようになりました。

$ docker-compose exec apache-php bash
root@44fb03a9a30d:/var/www/html# ls -la ./test_page
total 0
drwxr-xr-x. 2 1000 1000 20 Aug 28 11:49 .
drwxr-xr-x. 4 1000 1000 71 Aug 28 11:15 ..
lrwxrwxrwx  1 1000 1000 20 Aug 28 11:49 cats -> ../test/cats/dist <- 相対パスになってる!!
lrwxrwxrwx  1 1000 1000 20 Aug 28 11:49 dogs -> ../test/dogs/dist <- 相対パスになってる!!
...

些細なことですし、慣れている人には当たり前のことだったのかもしれませんが、気づくまでにかなりの時間を要しました。 なんとか解決出来てよかったです。