laradockを公式通りにしたら詰まったお話

# Dockerを使って以下の環境を作る
laravelにてPHP5.5環境を公式通りに作る際

```
chdir to cwd (\"/var/www/html\") set in config.json failed: no such file or directory
```

などのエラーが解消できずあれこれ詰まったので、その救済措置をここに記載します。

導入方法も兼ねて記載しているので
エラー解消までスキップしたい方は

- [🚨Emergency🚨](#emergency)

まで飛ばしてください

追記）7/9
解消しました。
どうやらphp-fpmのworkdirの設定を変えてあげなければならないようでした

- [07/9追記　解消](#079%E8%BF%BD%E8%A8%98%E8%A7%A3%E6%B6%88)

## 当方の環境
- 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`

```yml:.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はお好きなもので

```yml:root@{コンテナID}/var/www#
$ composer create-project laravel/laravel project_name

... お時間かかります ...

$ exit
```

### 共有パスの設定をする

`vim docker-compose.yml`

```yml:docker-compose.yml
10:- - ${APPLICATION}:/var/www
10:+ - ${APPLICATION}project_name:/var/www
```

## laradock準備(その他)

### mysqlの設定を変更する

`vim mysql/Dockerfile`

```yml:Dockerfile
1:- FROM mysql:8.0
1:+ FROM mysql:5.5
```

### apacheの設定を変更する

`vim .env`

```yml:.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
```

http://localhost:8008

<img width="719" alt="スクリーンショット 2017-07-08 23.50.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/f622c3ae-a83f-60f3-d76e-439c0483fabf.png">

おお…。行けた。



## 各バージョン確認

```yml:centOS
$ 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)
```

```yml:apache
$ 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
```

```yml:mysql
$ docker images "mysql"
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.5                 7896f0417528        2 weeks ago         262MB 
```

```yml:php-fpm
$ 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が２つ無いとダメな
おかしな状況になっております。

apache内のhttpd.confには
`DocumentRoot /var/www/public/`
と記載されており
publicになっているはずなのに…と頭を悩ませています。

考察としては
fpmのせいなのか…？
とも思ったりしています。

原因がわかり次第記述を変えていこうと思います。

## 07/9追記　解消
一旦Remove all dataをし

apache2内のDockerfile 13行目にある

```yml:apache2/Dockerfile
13:- WORKDIR /var/www/public/
13:+ WORKDIR /var/www/
```

php-fpm内のDockerfile-56 274行目にある

```yml:php-fpm/Dockerfile-56
274:- WORKDIR /var/www
274:+ WORKDIR /var/www/public
```

にする事で直りました。

apacheの方はいじらなくてもいいと思いますが
php-fpmの方はこのように明示してあげないと
centosのデフォルトパスを指定してしまうようです。

またapache2のコンテナに入りhttpd.confの中の
DocumentRootを変更するとpublicでいけるようです