CircleCIでDockerを使えないときの対処法(ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?)

最近、個人開発でCircleCIを導入中です。
が、情弱すぎるが故に大苦戦を強いられています:tired_face:

CircleCIってbitriseなんかとは違ってガッツリymlを手書きするスタイルなんですね。
こっちの方が好きかもです。

で、今回そこそこ苦戦を強いられたエラーですが

```ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?```

↑これです。
dockerを使っている人なら結構見覚えありますよね。以前にも何度も苦しめられたのですが、今回もです。

「これって、dockerグループ作って、自分をそこに追加すれば良いやつだよな。それかservice docker startでいけるやろ:tired_face:」
↑安易にそう思って敵とすら認識しなかったのですが・・・

・・・全然直らない

# 結論
結論から言うと、CircleCIのコンテナ（コンテナへの入り方は後述）の/run/docker-temp.sockの権限が問題だったようです

sudo docker-compose up -d
でも動くと思いますが、sudoつけてdockerを動かすと何かと不具合が多発した記憶があるのでできればなしで動くようにしたい・・・

というわけで早速、CircleCIのコンテナ内の/runの配下の権限をみてみます

```bash
$ls -al /run
total 16
drwxr-xr-x 1 root        root        4096 Sep  6 08:33 .
drwxr-xr-x 1 root        root        4096 Sep  6 08:33 ..
srw-rw---- 1 root        root           0 Sep  5 02:54 docker-temp.sock
lrwxrwxrwx 1 root        root          25 Sep  6 08:33 docker.sock -> /var/run/docker-temp.sock
drwxr-x--- 2 Debian-exim Debian-exim 4096 Sep  6 00:06 exim4
drwxrwxrwt 2 root        root        4096 Aug 31 00:00 lock
-rw-rw-r-- 1 root        utmp           0 Aug 31 00:00 utmp
```
docker-temp.sockのグループがroot rootになっています。
これに対して

```bash
sudo chown $(whoami):$(whoami) /run/docker-temp.sock
```

これをやれば使えるようになりました。実際のconfig.ymlを下の方に貼っときました
（※セキュリティ的な懸念があればどなたか教えてください。）

# その他の考えられる原因
config.ymlのstepsに

```
- setup_remote_docker
```
これが含まれているか確認してください（エラー文の通り、dockerが起動していない可能性）



# CircleCIのコンテナへの入り方（最下部にある参考文献より引用多し）
まずは、コンテナを10分間立ち上げるためにほぼ空っぽのconfig.ymlを用意します。

```yml:config.yml
version: 2
jobs:
  build:
    working_directory: ~/app
    docker:
      - image: circleci/python:3.6
    steps:
      - setup_remote_docker
      - run:
          name: test
          command: sleep 600
```
（引用）

次にdocker psで

```bash
$ docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS               NAMES
e1ebbeccc823        circleci/python:3.6   "/bin/sh"           7 seconds ago       Up 5 seconds                            vigorous_brattain
16ba46868114        circleci/picard       "circleci build"    9 seconds ago       Up 7 seconds                            hardcore_murdock
```
一番目のコンテナに入ります

```
$ docker exec -it vigorous_brattain bash
```

そしてsocketの権限を確認します

```
circleci@e1ebbeccc823:/$ ls -al /run
total 16
drwxr-xr-x 1 root        root        4096 Sep  6 08:33 .
drwxr-xr-x 1 root        root        4096 Sep  6 08:33 ..
srw-rw---- 1 root        root           0 Sep  5 02:54 docker-temp.sock
lrwxrwxrwx 1 root        root          25 Sep  6 08:33 docker.sock -> /var/run/docker-temp.sock
drwxr-x--- 2 Debian-exim Debian-exim 4096 Sep  6 00:06 exim4
drwxrwxrwt 2 root        root        4096 Aug 31 00:00 lock
-rw-rw-r-- 1 root        utmp           0 Aug 31 00:00 utmp
```

こんな感じで、コンテナに入ってsocketの権限を確認できます。


# 作成したconfig.yml
実際に動作したものを切り抜いて載せます

```config.yml
version: 2.1

executors:
  python_executor:
    docker:
      - image: circleci/python:3.8.2
    working_directory: ~/repo

jobs:
  build:
    executor: python_executor
    steps:
      - checkout
      - setup_remote_docker
      - run: 
          name: up
          command: |
            sudo chown root:$(whoami) /run/docker-temp.sock
            docker-compose up -d --build
```

こんな感じでどうにか動いて、ローカルでCIが動作しました。
明日はpushしてリモートで回してみますが、うまくいくと良いのですが・・・（フラグ）

# 参考
- https://qiita.com/u-minor/items/98853d8be139a005a1f8

圧倒的感謝:bow::bow::bow: