I'm brand new to Docker and fairly new to Rails.
When I run docker-compose up
, I get this error:
web_1 | bundler: command not found: rails
web_1 | Install missing gem executables with `bundle install`
app_web_1 exited with code 127
Initially I had trouble getting it to find any gem when running bundle install
. I was getting a "Could not find gem in any of the sources" error for every single Gem in my Gemfile. I then attempted to run bundle
(without install
) and it returned no errors.
Rails is definitely installed, as typing rails
gives me all of it's usage options.
Also, I can see the gems in vendor/cache
. I tried removing all of them and running bundle install
and they all start appearing one by one as the bundler installs them.
EDIT: Please feel free to correct my understanding: since running bundle install is meant to install the gems on the Docker instance, it is not being installed "locally". While attempting to troubleshoot this issue, I deleted all my gems locally and re-installed bundler. So, when I run gems list
, I only see bundler. I ran bundler install
and it claims that all the gems are being installed. Where are they being installed? It says it's going to vendor/cache, and that's true. I can see them there, yet it still fails to find any gems: it won't even find rails.
EDIT 2: I should also mention: bin/rails s
starts the server just fine. It won't load anything due to the database instance not running, but that makes sense I guess.
EDIT 3: I ran gem install rails
locally, still no change but now gems list
returns rails and its dependencies.
Below are some files and logs that may be relevant below and could help determine the cause. Please note I changed the actual application name to app
.
Running gems list
returns this:
*** 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)
My Gemfile looks like this:
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]
My docker-compose.yml
file looks like this:
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
My Dockerfile
looks like this:
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
Running bundle install
returns this:
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.
I am not sure if this is a proper solution, but I tried adding
RUN bundler install
to my Dockerfile
. I deleted all of the images, ran docker-compose up
and worked like a charm.
Another possible solution that worked for me is to create a docker-entrypoint.sh
file in the root of your project similar to this:
#!/bin/bash
bundle install --jobs 20 --retry 5
and add this steps in your 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"]
This way you have the possibility to run this shellscript file around the initialization of your container. You can read more about this here: https://success.docker.com/article/use-a-script-to-initialize-stateful-container-data
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With