はじめに
vscode の rubocop 拡張 ruby-rubocop を Docker 環境で使用したところかなり詰まったのでその備忘録です。
ホストに rubocop をインストールすれば良いという記事が散見されましたが、根本的な解決になっていません。ここではホストを汚さずコンテナ内の rubocop を参照するような解決方法をあげます。
一人でも多くの方の参考になれば幸いです。
何も設定していない時のエラー ( rubocop 拡張入れただけ)
command /Users/horisho/.rbenv/shims/rubocop returns empty output! please check configuration.
ホストに rubocop は存在しないので、 docker コンテナに実行先を向けないといけません。
初期設定
こちらのIssueコメントを参考に設定をしました。
rubocop の実行ファイルを作成し、実行環境を Docker コンテナ内に向けている形です。
ディレクトリ構成は以下のようです。
$ tree -L 2 -a
.
├── .vscode
│ └── settings.json
├── api
│ ├── .rubocop.yml
│ ├── rubocop
│ └── 略
├── docker-compose.yml
└── 略
ファイルの中身は以下のようです。
#!/bin/bash
docker-compose exec -T api bundle exec rubocop -c .rubocop.yml "$@"
version: "3"
services:
api:
build:
context: ./api
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
depends_on:
- db
- redis
volumes:
- './api:/myapp'
ports:
- '3010:3000'
tty: true
stdin_open: true
env_file:
- .env
# 以下略
{
"ruby.rubocop.executePath": "./api/"
}
rubocop 周りの設定ファイルはapi
ディレクトリに含め、起動コンテナにマウントしている状態です。また、Issueコメントとは異なり、 rubocop 拡張の実行パスを./api
に向けています。
遭遇したエラーメッセージ
command ./api/rubocop returns empty output! please check configuration.
./rubocop is not executable
結論(修正方法)
rubocop 実行ファイルをdocker-compose.yml
と同階層に配置し、実行パスをIssueコメント同様./
に修正すれば良い。
$ tree -L 2 -a
.
├── .vscode
│ └── settings.json
├── api
│ ├── .rubocop.yml
│ └── 略
├── docker-compose.yml
├── rubocop
└── 略
{
"ruby.rubocop.executePath": "./"
}
原因
rubocop 実行ファイル(/api
ディレクトリ)で docker-compose
コマンドを実行しています。当然 docker-compose
は同階層の docker-compose.yml
を参照しにいきますが、 /api
ディレクトリには存在せず、ルートディレクトリに存在します。そのため、コンテナが見つからずエラーというわけです。
注意点
rubocop実行ファイルでdocker-compose exec api ...
とexec
コマンドを実行しているため、コンテナがすでに立ち上がっていないとエラーで怒られます。