最近、個人開発でCircleCIを導入中です。
が、情弱すぎるが故に大苦戦を強いられています
CircleCIってbitriseなんかとは違ってガッツリymlを手書きするスタイルなんですね。
こっちの方が好きかもです。
で、今回そこそこ苦戦を強いられたエラーですが
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
↑これです。
dockerを使っている人なら結構見覚えありますよね。以前にも何度も苦しめられたのですが、今回もです。
「これって、dockerグループ作って、自分をそこに追加すれば良いやつだよな。それかservice docker startでいけるやろ」
↑安易にそう思って敵とすら認識しなかったのですが・・・
・・・全然直らない
結論
結論から言うと、CircleCIのコンテナ(コンテナへの入り方は後述)の/run/docker-temp.sockの権限が問題だったようです
sudo docker-compose up -d
でも動くと思いますが、sudoつけてdockerを動かすと何かと不具合が多発した記憶があるのでできればなしで動くようにしたい・・・
というわけで早速、CircleCIのコンテナ内の/runの配下の権限をみてみます
$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になっています。
これに対して
sudo chown $(whoami):$(whoami) /run/docker-temp.sock
これをやれば使えるようになりました。実際のconfig.ymlを下の方に貼っときました
(※セキュリティ的な懸念があればどなたか教えてください。)
その他の考えられる原因
config.ymlのstepsに
- setup_remote_docker
これが含まれているか確認してください(エラー文の通り、dockerが起動していない可能性)
CircleCIのコンテナへの入り方(最下部にある参考文献より引用多し)
まずは、コンテナを10分間立ち上げるためにほぼ空っぽの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で
$ 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
実際に動作したものを切り抜いて載せます
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してリモートで回してみますが、うまくいくと良いのですが・・・(フラグ)
参考
圧倒的感謝