Dockerを使って以下の環境を作る
laravelにてPHP5.5環境を公式通りに作る際
chdir to cwd (\"/var/www/html\") set in config.json failed: no such file or directory
などのエラーが解消できずあれこれ詰まったので、その救済措置をここに記載します。
導入方法も兼ねて記載しているので
エラー解消までスキップしたい方は
まで飛ばしてください
追記)7/9
解消しました。
どうやらphp-fpmのworkdirの設定を変えてあげなければならないようでした
当方の環境
- macOS Sierra
以下の環境を作る
- CentOS 7系
- Apache 2.4
- PHP 5.6
- MySQL 5.5
- Laravel 5
Dockerをインストール
dockerのホームページにアクセス
https://docs.docker.com/docker-for-mac/
Get Docker for Mac (Stable)
からダウンロードしてください
laradockの準備(workspace)
laradock : https://github.com/laradock/laradock
公式通りの手順で行いたいと思います。
作業領域を作る
$ mkdir laravel
$ cd laravel
laradockをクローンする
$ git clone https://github.com/Laradock/laradock.git
$ cd laradock
.envファイルを用意する
$ cp env-example .env
.envファイルに追加する
vim .env
#一番最後の行
DB_HOST=mysql
workspaceをcomposeする
$ docker-compose up -d workspace
お時間かかるので少々コーヒーでも飲んで待ちましょう
workspaceの中へ入る
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------
laradock_applications_1 /true Exit 0
laradock_workspace_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp
$ docker exec -it laradock_workspace_1 /bin/bash
※project_nameはお好きなもので
$ composer create-project laravel/laravel project_name
... お時間かかります ...
$ exit
共有パスの設定をする
vim docker-compose.yml
10:- - ${APPLICATION}:/var/www
10:+ - ${APPLICATION}project_name:/var/www
laradock準備(その他)
mysqlの設定を変更する
vim mysql/Dockerfile
1:- FROM mysql:8.0
1:+ FROM mysql:5.5
apacheの設定を変更する
vim .env
84:- APACHE_HOST_HTTP_PORT=80
84:+ APACHE_HOST_HTTP_PORT=8008
ここで8008にしたのはポートが重複しないようにするため
vim apache2/Dockerfile
1:- FROM webdevops/apache:ubuntu-16.04
1:+ FROM webdevops/apache:centos-7
centOS7に変更する
composeする
$ docker-compose up -d mysql apache2 php-fpm
🚨Emergency🚨
ここまで公式通りにやると下記のようなエラーが出ます。
ERROR: for php-fpm Cannot start service php-fpm: oci runtime error: container_linux.go:247: starting container process caused "chdir to cwd (\"/var/www/html\") set in config.json failed: no such file or directory"
ERROR: Encountered errors while bringing up the project.
うーん…。
ubuntuでは/var/www/publicであるのに対して
centosでは/var/www/htmlなのか…?
とりあえず一旦救済措置として
$ cd ../project_name
$ mkdir html
$ cp -rf public/* html/
$ docker-compose up -d apache2
おお…。行けた。
各バージョン確認
$ docker-compose ps "apache2"
Name Command State Ports
---------------------------------------------------------------------------------------------------------
laradock_apache2_1 /opt/docker/bin/entrypoint ... Up 0.0.0.0:4438->443/tcp, 0.0.0.0:8008->80/tcp
$ docker exec -it laradock_apache2_1 /bin/bash
[root@{コンテナID} public]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
$ docker-compose ps "apache2"
Name Command State Ports
---------------------------------------------------------------------------------------------------------
laradock_apache2_1 /opt/docker/bin/entrypoint ... Up 0.0.0.0:4438->443/tcp, 0.0.0.0:8008->80/tcp
$ docker exec -it laradock_apache2_1 /bin/bash
[root@{コンテナID} public]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Apr 12 2017 21:03:28
$ docker images "mysql"
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.5 7896f0417528 2 weeks ago 262MB
$ docker-compose ps "php-fpm"
Name Command State Ports
---------------------------------------------------------------------
laradock_php-fpm_1 docker-php-entrypoint php-fpm Up 9000/tcp
$ docker exec -it laradock_php-fpm_1 /bin/bash
root@{コンテナID}:/var/www# php -v
PHP 5.6.30 (cli) (built: Mar 21 2017 23:05:12)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
最後に
これはあくまで救済措置であって
スマートなやり方ではありません。
publicをhtmlにしてしまうとapache上で
とてつもないエラーを吐き出してしまいます
なので現状publicとhtmlが2つ無いとダメな
おかしな状況になっております。
apache内のhttpd.confには
DocumentRoot /var/www/public/
と記載されており
publicになっているはずなのに…と頭を悩ませています。
考察としては
fpmのせいなのか…?
とも思ったりしています。
原因がわかり次第記述を変えていこうと思います。
07/9追記 解消
一旦Remove all dataをし
apache2内のDockerfile 13行目にある
13:- WORKDIR /var/www/public/
13:+ WORKDIR /var/www/
php-fpm内のDockerfile-56 274行目にある
274:- WORKDIR /var/www
274:+ WORKDIR /var/www/public
にする事で直りました。
apacheの方はいじらなくてもいいと思いますが
php-fpmの方はこのように明示してあげないと
centosのデフォルトパスを指定してしまうようです。
またapache2のコンテナに入りhttpd.confの中の
DocumentRootを変更するとpublicでいけるようです