Rubyと筋肉とギターとわたし

エンジニア二年目の雑魚です。プログラミング・ギター・筋トレのことをメインにブログを書いていきます。

【Rails】docker-composeでrails generateが使えず、Could not find rake ~~~~になる

どうもてぃです。

もうそろそろ梅雨ですね。ジメジメしたのは嫌いです。

今回は docker-compose を使って rails g controller を行うと起こるエラーの対処方法について書こうと思います。

環境

  • Docker version 17.12.0-ce, build c97c6d6
  • docker-compose version 1.20.1, build 5d8c71b

起こったこと

f:id:rdwbocungelt5:20190522160146p:plain

いつもどおり、Dockerfileとdocker-compose.ymlを作成し、イメージのビルド、サーバーの起動まで上手くいきました。

以下がDockerfileとdocker-compose.yml

FROM ruby:2.5
ENV LANG C.UTF-8
ENV APP_ROOT /myapp

RUN apt-get update -qq && \
    apt-get install -y build-essential libpq-dev nodejs postgresql-client && \
    rm -rf /var/lig/apt/lists/*
RUN gem install rails

WORKDIR $APP_ROOT
COPY Gemfile ${APP_ROOT}/Gemfile
COPY Gemfile.lock ${APP_ROOT}/Gemfile.lock
RUN bundle install --path vendor/bundle

ADD . /myapp
version: "3"
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: root
    ports:
      - "5432"
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -b 0.0.0.0 -p 3000"
    volumes:
      - .:/myapp
      - ./vendor/bundle:/myapp/vendor/bundle:delegated
      - /myapp/tmp/cache
      - /myapp/log
      - /myapp/vendor
      - /myapp/.git
    environment:
      RAILS_ENV: development
      DATABASE_HOST: db
      DATABASE_PORT: 5432
      DATABASE_USER: postgres
      DATABASE_PASSWORD: root
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true

ここにのせるとインデントがずれてますが、よくある構成だと思います。

上記の設定を元に環境を作ったあと、 rspec を導入したかったのでいつものコマンドを入力しました。

すると。。。

$ docker-compose run web bundle exec rails g rspec:install
Starting myapp_db_1 ... done
Could not find rake-12.3.2 in any of the sources
Run `bundle install` to install missing gems.

bundle installもうまくいくし、問題なさそうなのに Could not find rake-12.3.2 in any of the sources が出てくる。

対処法

stackoverflowで全く同じ質問していた人がいたので、参考にしてみた。

$ docker-compose run web bundle install --binstubs

# 自分の環境ではvendor/bundle配下に設置
$ docker-compose run web bundle install --path vendor/bundle

さて、ジェネレーターはちゃんと動くのか?

$ docker-compose run web bundle exec rails g rspec:install

Starting myapp_db_1 ... done
Beginning in Rails 4, Rails ships with a `rails` binstub at ./bin/rails that
should be used instead of the Bundler-generated `rails` binstub.

If you are seeing this message, your binstub at ./bin/rails was generated by
Bundler instead of Rails.

You might need to regenerate your `rails` binstub locally and add it to source
control:

 rails app:update:bin           # Bear in mind this generates other binstubs
                                # too that you may or may not want (like yarn)

If you already have Rails binstubs in source control, you might be
inadverently overwriting them during deployment by using bundle install
with the --binstubs option.

If your application was created prior to Rails 4, here's how to upgrade:

  bundle config --delete bin    # Turn off Bundler's stub generator
  rails app:update:bin          # Use the new Rails executables
  git add bin                   # Add bin/ to source control

You may need to remove bin/ from your .gitignore as well.

When you install a gem whose executable you want to use in your app,
generate it and add it to source control:

  bundle binstubs some-gem-name
  git add bin/new-executable

      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
Usage:
  rails new APP_PATH [options]

Options:
      [--skip-namespace], [--no-skip-namespace]            # Skip namespace (affects only isolated applications)
  -r, [--ruby=PATH]                                        # Path to the Ruby binary of your choice
                                                           # Default: /usr/local/bin/ruby
  -m, [--template=TEMPLATE]                                # Path to some application template (can be a filesystem path or URL)
  -d, [--database=DATABASE]                                # Preconfigure for selected database (options: mysql/postgresql/sqlite3/oracle/frontbase/ibm_db/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc)
                                                           # Default: sqlite3
      [--skip-yarn], [--no-skip-yarn]                      # Don't use Yarn for managing JavaScript dependencies
      [--skip-gemfile], [--no-skip-gemfile]                # Don't create a Gemfile
  -G, [--skip-git], [--no-skip-git]                        # Skip .gitignore file
      [--skip-keeps], [--no-skip-keeps]                    # Skip source control .keep files
  -M, [--skip-action-mailer], [--no-skip-action-mailer]    # Skip Action Mailer files
  -O, [--skip-active-record], [--no-skip-active-record]    # Skip Active Record files
      [--skip-active-storage], [--no-skip-active-storage]  # Skip Active Storage files
  -P, [--skip-puma], [--no-skip-puma]                      # Skip Puma related files
  -C, [--skip-action-cable], [--no-skip-action-cable]      # Skip Action Cable files
  -S, [--skip-sprockets], [--no-skip-sprockets]            # Skip Sprockets files
      [--skip-spring], [--no-skip-spring]                  # Don't install Spring application preloader
      [--skip-listen], [--no-skip-listen]                  # Don't generate configuration that depends on the listen gem
      [--skip-coffee], [--no-skip-coffee]                  # Don't use CoffeeScript
  -J, [--skip-javascript], [--no-skip-javascript]          # Skip JavaScript files
      [--skip-turbolinks], [--no-skip-turbolinks]          # Skip turbolinks gem
  -T, [--skip-test], [--no-skip-test]                      # Skip test files
      [--skip-system-test], [--no-skip-system-test]        # Skip system test files
      [--skip-bootsnap], [--no-skip-bootsnap]              # Skip bootsnap gem
      [--dev], [--no-dev]                                  # Setup the application with Gemfile pointing to your Rails checkout
      [--edge], [--no-edge]                                # Setup the application with Gemfile pointing to Rails repository
      [--rc=RC]                                            # Path to file containing extra configuration options for rails command
      [--no-rc], [--no-no-rc]                              # Skip loading of extra configuration options from .railsrc file
      [--api], [--no-api]                                  # Preconfigure smaller stack for API only apps
  -B, [--skip-bundle], [--no-skip-bundle]                  # Don't run bundle install
      [--webpack=WEBPACK]                                  # Preconfigure for app-like JavaScript with Webpack (options: react/vue/angular/elm/stimulus)

Runtime options:
  -f, [--force]                    # Overwrite files that already exist
  -p, [--pretend], [--no-pretend]  # Run but do not make any changes
  -q, [--quiet], [--no-quiet]      # Suppress status output
  -s, [--skip], [--no-skip]        # Skip files that already exist

Rails options:
  -h, [--help], [--no-help]        # Show this help message and quit
  -v, [--version], [--no-version]  # Show Rails version number and quit

Description:
    The 'rails new' command creates a new Rails application with a default
    directory structure and configuration at the path you specify.

    You can specify extra command-line arguments to be used every time
    'rails new' runs in the .railsrc configuration file in your home directory.

    Note that the arguments specified in the .railsrc file don't affect the
    defaults values shown above in this help message.

Example:
    rails new ~/Code/Ruby/weblog

    This generates a skeletal Rails installation in ~/Code/Ruby/weblog.

rspecの設定ファイルは作成できたけど、なんかめっちゃ出てる。

要約するとbin関連をupdateしないといけないみたいね。ということでやってみた。

$ docker-compose run web bundle exec rails app:update:bin
# 以下全てOverwriteする

bin関連でOverwriteするかどうか出てくるので全て上書きでおk。

終わりに

念の為、controllerが作成できるか試してみた。

$ docker-compose run web bundle exec rails g controller Home index

特にエラーも警告もなくコントローラー生成できた\(^o^)/

二回も同じことで躓いたので、流石にメモ。

安易にdockerに頼り過ぎないようにしましょうね。