Docker & Rails |捆绑器:找不到命令:rails

Docker & Rails | bundler: command not found: rails

我是运行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 时很难找到任何 gem。对于我的 Gem 文件中的每个 Gem,我都收到“无法在任何来源 中找到 gem”错误。然后我尝试 运行 bundle(没有 install)并且它没有返回任何错误。

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

此外,我可以在 vendor/cache 中看到 gem。我尝试删除所有这些并 运行ning bundle install 并且当捆绑器安装它们时它们都开始一个接一个地出现。

编辑: 请随时纠正我的理解:因为 运行ning bundle install 是为了在 [=84] 上安装 gems =] 实例,它没有被安装 "locally"。在尝试解决此问题时,我在本地删除了所有 gem 并重新安装了捆绑程序。所以,当我 运行 gems list 时,我只看到 bundler。我 运行 bundler install 并且它声称正在安装所有 gem。它们安装在哪里?它说它将到达 vendor/cache,这是真的。我可以在那里看到它们,但它仍然找不到任何 gem:它甚至找不到 rails.

编辑 2: 我还应该提到:bin/rails s 启动服务器就好了。由于数据库实例不是 运行ning,它不会加载任何内容,但我想这是有道理的。

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

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

运行 gems list returns 这个:

*** 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)

我的 Gem 文件如下所示:

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 returns 这个:

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.

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

RUN bundler install

给我的 Dockerfile。我删除了所有图像,运行 docker-compose up 并且工作得很好。

另一种对我有用的可能解决方案是在项目的根目录中创建一个类似于此的 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