CircleCI x Docker Compose の volume mounts でハマったメモ

# 概要
Ruby on Rails の勉強のために [sandbox-rails](https://github.com/issuy/sandbox-rails) を作って色々実験中。

まずは [Quickstart: Compose and Rails](https://docs.docker.com/compose/rails/) を参考に基本となるプロジェクトを作成。
次に自動テスト環境を構築したいので、一先ず rubocop を入れて CircleCI 上で動くようにしたい。
そこで [Installing and Using docker-compose](https://circleci.com/docs/2.0/docker-compose/#section=configuration) を参考にして CircleCI 用の設定を書いていく。

ここで問題が。手元で動く rubocop が CircleCI 上で動いてない。

[Using Docker Compose with Docker Executor](https://circleci.com/docs/2.0/docker-compose/#using-docker-compose-with-docker-executor) に書いてあるけど、`setup_remote_docker` を使っている場合 `ボリュームマウントは機能しない` とのこと。
これに気付いて docker-compose.yml からボリュームマウントの設定を削除したら、rubocopが動いた。

# 症状
設定ファイル：

- [.circleci/config.yml](https://github.com/issuy/sandbox-rails/blob/870f8c318e10bdf768a8b1fa5dbb1c9989df11c9/.circleci/config.yml)
- [docker-compose.yml](https://github.com/issuy/sandbox-rails/blob/870f8c318e10bdf768a8b1fa5dbb1c9989df11c9/docker-compose.yml)

実行結果：

- `Could not locate Gemfile or .bundle/ directory` 
![rubocop_failed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280803/7d29ec03-9415-57a9-066f-828f1ba7f7c6.png)

# 解析
実行結果から分かる通り、必要なファイルが必要な場所にない。
では何故ないのか？ CircleCI 上で実行したJOBの中身を覗かないと分からない。

`Rerun job with SSH` で実行したJOBにSSHできる
![rerun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280803/83078ce1-f672-ad9f-4b8c-1fa019a1e27f.png)

JOBの終了を待って、SSHでログインして以下のコマンドを実行：

```shell
circleci@acd63e5b1200:~$ cd project/
circleci@acd63e5b1200:~/project$ docker-compose run web bash
Starting project_db_1 ... done
root@7d2d5dd7111b:/myapp# ls -al
total 12
drwxr-xr-x  3 root root 4096 Apr 30 03:00 .
drwxr-xr-x 70 root root 4096 Apr 30 03:03 ..
drwxr-xr-x  3 root root 4096 Apr 30 03:00 tmp
```

なぜか `tmp/` だけ存在してる。
（Docker とか CircleCI とか全然詳しくないので頭の中が真っ白に。。。）

わかっているのは以下：

- JOBのWorking Directoryにはデータが存在する
  - `project/` 配下には[sandbox-rails](https://github.com/issuy/sandbox-rails)の内容が配置されている
- JOBのWorking Directoryから起動した `docker-compose` のWorking Directoryには配置されていない
  - そのため `Could not locate Gemfile or .bundle/ directory` って言われている

悶々としながら似たようなケースがないか検索するも引っかからず。。。
一旦冷静になる。
基本に立ち返ろうと読んだ [Using Docker Compose with Docker Executor](https://circleci.com/docs/2.0/docker-compose/#using-docker-compose-with-docker-executor) に、 `setup_remote_docker` を使っている場合 `ボリュームマウントは機能しない` と書かれているのに気づく（ドキュメントちゃんと読もう）。
そこから、 [docker-compose.yml](https://github.com/issuy/sandbox-rails/blob/870f8c318e10bdf768a8b1fa5dbb1c9989df11c9/docker-compose.yml#L10-L11) でボリュームマウントの設定していることに気付く。

# 解消方法
原因は以下：

- CircleCI のJOBで `setup_remote_docker` を使っている場合 `ボリュームマウントは機能しない`
- docker-compose.yml でボリュームマウントの設定している

なので、以下の設定を削除した状態でJOBを実行

```yml:docker-compose.yml
    volumes:
      - .:/myapp
```

その結果、 rubocop が動き出した。

設定変更前に `tmp/` しか配置されていなかった`docker-compose` のWorking Directoryにも、ちゃんと[sandbox-rails](https://github.com/issuy/sandbox-rails)の内容が配置されている。

```sh
circleci@96d8114ad6f3:~/project$ cd
circleci@96d8114ad6f3:~$ cd project/
circleci@96d8114ad6f3:~/project$ docker-compose run web bash
Starting project_db_1 ... done
root@9418efa94560:/myapp# ls -al
total 108
drwxr-xr-x 15 root root 4096 Apr 30 05:29 .
drwxr-xr-x 70 root root 4096 Apr 30 05:31 ..
drwxr-xr-x  2 root root 4096 Apr 30 05:26 .circleci
drwxr-xr-x  8 root root 4096 Apr 30 05:26 .git
-rw-r--r--  1 root root  647 Apr 30 05:26 .gitignore
~(省略)~
```

# まとめ
そもそも [Using Docker Compose with Docker Executor](https://circleci.com/docs/2.0/docker-compose/#using-docker-compose-with-docker-executor) でボリュームマウント機能しない件や、 [Quickstart: Compose and Rails](https://docs.docker.com/compose/rails/) でボリュームマウントの設定がされていることを認識していなかった（設定内容ちゃんと把握しよう）。
まぁ勉強とか実験のためにやってるので、そこはご愛嬌ってことで(*´ω`*)
逆に色々把握できてよかった(๑•̀ㅂ•́)و✧