Docker&导轨| bundler:找不到命令:rails

时间:2017-05-21 15:09:01

标签: ruby-on-rails docker rubygems bundler

我是Docker的新手,也是Rails的新手。

当我运行docker-compose up时,我收到此错误:

web_1  | bundler: command not found: rails
web_1  | Install missing gem executables with `bundle install`
app_web_1 exited with code 127

最初我在运行bundle install时无法找到任何宝石。我得到了一个" 无法找到任何来源的宝石"我的Gemfile中每个Gem的错误。然后我尝试运行bundle(没有install)并且没有返回任何错误。

Rails肯定已安装,因为输入rails会为我提供所有使用选项。

另外,我可以在vendor/cache中看到宝石。我尝试删除所有这些并运行bundle install,当捆绑程序安装它们时,它们都会一个接一个地出现。

编辑:请随意纠正我的理解:因为运行捆绑安装意味着在Docker实例上安装宝石,所以没有安装"本地"。在尝试解决此问题时,我在本地删除了所有宝石并重新安装了bundler。所以,当我运行gems list时,我只看到捆绑器。我跑bundler install并声称所有宝石都已安装。他们在哪里安装?它表示它将进入供应商/缓存,这是真的。我可以在那里看到它们,但它仍然没有找到任何宝石:它甚至找不到铁轨。

编辑2:我还应该提一下:bin/rails s启动服务器就好了。由于数据库实例没有运行,它不会加载任何东西,但我认为这是有意义的。

编辑3:我在本地运行了gem install rails,但仍然没有变化,但现在gems list返回了rails及其依赖项。

以下是一些可能与以下相关的文件和日志,可帮助确定原因。请注意,我将实际的应用程序名称更改为app

正在运行gems list会返回:

*** LOCAL GEMS ***

actionmailer (5.1.1)
actionpack (5.1.1)
actionview (5.1.1)
activejob (5.1.1)
activemodel (5.1.1)
activerecord (5.1.1)
activesupport (5.1.1)
arel (8.0.0)
builder (3.2.3)
bundler (1.15.0)
concurrent-ruby (1.0.5)
erubi (1.6.0)
globalid (0.4.0)
i18n (0.8.1)
loofah (2.0.3)
mail (2.6.5)
method_source (0.8.2)
mime-types (3.1)
mime-types-data (3.2016.0521)
mini_portile2 (2.1.0)
minitest (5.10.2)
nio4r (2.0.0)
nokogiri (1.7.2)
rack (2.0.3)
rack-test (0.6.3)
rails (5.1.1)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.0.3)
railties (5.1.1)
rake (12.0.0)
sprockets (3.7.1)
sprockets-rails (3.2.0)
thor (0.19.4)
thread_safe (0.3.6)
tzinfo (1.2.3)
websocket-driver (0.6.5)
websocket-extensions (0.1.2)

我的Gemfile如下所示:

source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

gem 'gmail'

gem 'oauth', '0.5.2'

gem 'twilio'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.0.1'
# Use postgres as the database for Active Record
gem 'pg'
# Use Puma as the app server
gem 'puma', '~> 3.0'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platform: :mri
end

group :development do
  # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '~> 3.0.5'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

我的docker-compose.yml文件如下所示:

version: '2'
services:
  db:
    image: postgres
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db

我的Dockerfile看起来像这样:

FROM ruby:2.4.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
ADD . /app

正在运行bundle install会返回:

Using rake 12.0.0
Using oauth 0.5.2
Using mime-types-data 3.2016.0521
Using builder 3.2.3
Using multi_xml 0.6.0
Using concurrent-ruby 1.0.5
Using i18n 0.8.1
Using minitest 5.10.2
Using thread_safe 0.3.6
Using erubis 2.7.0
Using mini_portile2 2.1.0
Using rack 2.0.3
Using nio4r 2.0.0
Using websocket-extensions 0.1.2
Using arel 7.1.4
Using method_source 0.8.2
Using thor 0.19.4
Using bundler 1.15.0
Using pg 0.20.0
Using puma 3.8.2
Using sass 3.4.24
Using tilt 2.0.7
Using execjs 2.7.0
Using coffee-script-source 1.12.2
Using turbolinks-source 5.0.3
Using multi_json 1.12.1
Using byebug 9.0.6
Using bindex 0.5.0
Using rb-fsevent 0.9.8
Using ffi 1.9.18
Using gmail_xoauth 0.4.2
Using mime-types 3.1
Using httparty 0.15.5
Using tzinfo 1.2.3
Using nokogiri 1.7.2
Using rack-test 0.6.3
Using sprockets 3.7.1
Using websocket-driver 0.6.5
Using uglifier 3.2.0
Using coffee-script 2.4.1
Using turbolinks 5.0.1
Using rb-inotify 0.9.8
Using mail 2.6.5
Using twilio 3.1.1
Using activesupport 5.0.3
Using loofah 2.0.3
Using listen 3.0.8
Using gmail 0.6.0
Using rails-dom-testing 2.0.3
Using globalid 0.4.0
Using activemodel 5.0.3
Using jbuilder 2.6.4
Using spring 2.0.1
Using rails-html-sanitizer 1.0.3
Using activejob 5.0.3
Using activerecord 5.0.3
Using spring-watcher-listen 2.0.1
Using actionview 5.0.3
Using actionpack 5.0.3
Using actioncable 5.0.3
Using actionmailer 5.0.3
Using railties 5.0.3
Using sprockets-rails 3.2.0
Using coffee-rails 4.2.1
Using jquery-rails 4.3.1
Using web-console 3.5.1
Using rails 5.0.3
Using sass-rails 5.0.6
Updating files in vendor/cache
Bundle complete! 18 Gemfile dependencies, 68 gems now installed.
Bundled gems are installed into ./vendor/cache.

2 个答案:

答案 0 :(得分:4)

我不确定这是否是一个合适的解决方案,但我尝试添加

RUN bundler install

到我的Dockerfile。我删除了所有图片,运行docker-compose up并像魅力一样工作。

答案 1 :(得分:0)

另一个对我有用的解决方案是在您项目的根目录中创建一个docker-entrypoint.sh文件,如下所示:

#!/bin/bash
bundle install --jobs 20 --retry 5

并将此步骤添加到您的Dockerfile

# allows a shell script to run before any relative containers execute a command.
COPY ./docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]

这样,您就有可能在容器的初始化周围运行此shellscript文件。您可以在此处了解更多信息:https://success.docker.com/article/use-a-script-to-initialize-stateful-container-data