0

I'm trying to create an environment for developing some Ruby on Rails applications using Docker.

I'm following the official guide for a ruby on rails application on the docker website

The following are my Gemfile, Dockerfile and docker-compose.yml.

source 'https://rubygems.org'
gem 'rails', '~>6'
# syntax=docker/dockerfile:1
FROM ruby:latest
RUN apt-get update -qq && apt-get install -y nodejs
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]
version: "3.9"
services:
  db:
    image: mysql:8
    restart: always
    ports:
      - 3306:3306
    volumes:
      - dbdata:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: app_db
      MYSQL_USER: db_user
      MYSQL_PASSWORD: db_user_pass
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
  dbdata:

The only changes I have made to the guide is to use Rails 6, the latest version of ruby and to use MySQL instead of postgres. When I try to run 'docker-compose build' I get the following error:

ERROR [7/9] RUN bundle install
#17 0.505 /usr/local/lib/ruby/3.0.0/rubygems.rb:281:in `find_spec_for_exe': Could not find 'bundler' (1.17.3) required by your /app/Gemfile.lock. (Gem::GemNotFoundException)
#17 0.505 To update to the latest version installed on your system, run `bundle update --bundler`.

The error message is clear, I don't have the correct version of bundler installed. At the bottom of my Gemfile.lock file I have the following:

RUBY VERSION
   ruby 2.5.9p229

BUNDLED WITH
   1.17.3

I had assumed that my ruby version would have been the latest version and that my Gemfile would have been bundled with > 2.0. I tried adding 'RUN gem bundle install' in my Dockerfile but that did not fix the issue. Is there a correct way I can specify docker to use the latest version of ruby, rails and bundler that are compatible with each other.

Peck3277
  • 1,383
  • 8
  • 22
  • 46
  • 2
    Did you try the solutions here: https://stackoverflow.com/questions/47026174/find-spec-for-exe-cant-find-gem-bundler-0-a-gemgemnotfoundexception – dan-klasson Oct 21 '21 at 19:33
  • Bundler 2.x is extremely picky about running a version of Bundler that _exactly_ matches what's listed in the `Gemfile.lock` file. You may need to `RUN gem install bundler:1.17.3` or rebuild `Gemfile.lock`, which are both suggested in @dan-klasson's linked question. – David Maze Oct 21 '21 at 20:03

1 Answers1

0

You can add this line before RUN bundle install in your Dockerfile:

ENV BUNDLE_VERSION 1.17.3
RUN gem install bundler --version "$BUNDLE_VERSION"
Ghouse Mohamed
  • 387
  • 4
  • 10