Docker Image with RoR isn’t working (Yarn Issues with Bundler)

  bundler, docker-compose, dockerfile, ruby-on-rails, yarn

UPDATE: I got Yarn to work in dockerizing my RoR app. But, now when the docker image is set to up, bundler fails in setting puma.

Here is my new Dockerfile

# Use Ruby 2.6.2 version.
FROM ruby:2.6.2

# Optionally set a maintainer name to let people know who made this image.
LABEL maintainer="The Christian Chain <[email protected]>"

# Install dependencies:
# - build-essential: To ensure certain gems can be compiled
# - nodejs: Compile assets
# - libpq-dev: Communicate with postgres through the postgres gem

RUN apt-get update && apt-get install -qq -y --no-install-recommends 
build-essential libpq-dev nodejs

# Set an environment variable to store where the app is installed to inside
# of the Docker image. The name matches the project name out of convention only.

ENV INSTALL_PATH /heis_soma
RUN mkdir -p $INSTALL_PATH

# This sets the context of where commands will be ran in and is documented
# on Docker's website extensively.

WORKDIR $INSTALL_PATH

# Download Node and Yarn

RUN curl https://deb.nodesource.com/setup_12.x | bash
RUN curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

# Install Node.js and Yarn
RUN apt-get update && apt-get install -y nodejs yarn

# This is because I get an error in testing stating that the yarn file is not 
# up-to-date, though it still says that after running this so I have to turn off the
# integrity check.

RUN yarn install --check-files

RUN gem update --system

# Ensure gems are cached and only get updated when they change. This will
# drastically increase build times when your gems do not change.

COPY Gemfile Gemfile

# We want binstubs to be available so we can directly call sidekiq and
# potentially other binaries as command overrides without depending on
# bundle exec.

RUN bundle install --binstubs

# Copy in the application code from your work station at the current directory
# over to the working directory.

COPY . .

# Provide a dummy DATABASE_URL to Rails so it can pre-compile assets.

RUN bundle exec rake RAILS_ENV=production DATABASE_URL=postgresql://user:[email protected]/dbname SECRET_TOKEN=dummytoken assets:precompile

# Ensure the static assets are exposed through a volume so that nginx can read
# in these values later.

VOLUME ["$INSTALL_PATH/public"]

# The default command that gets ran will be to start the Puma server.

CMD bundle exec puma -C config/puma.rb

Errors that cause dbs to shut down. First is the main db:

[6] Puma starting in cluster mode...
heis_soma_1  | [6] * Version 4.2.1 (ruby 2.6.2-p47), codename: Distant Airhorns
heis_soma_1  | [6] * Min threads: 5, max threads: 5
heis_soma_1  | [6] * Environment: development
heis_soma_1  | [6] * Process workers: 1
heis_soma_1  | [6] * Preloading application
heis_soma_1  | bundler: failed to load command: puma (/usr/local/bundle/ruby/2.6.0/bin/puma)
heis_soma_1  | Errno::EPERM: Operation not permitted - bs_fetch:open_cache_file:open
heis_soma_1  | [6] ! Unable to load application: Errno::EPERM: Operation not permitted - bs_fetch:open_cache_file:open
heis_soma_heis_soma_1 exited with code 1

Second is the sidekiq instance which exits with the same issue.

Now, these exit randomly. If I go to the MacOS Docker Desktop and start up the heis_soma_heis_soma, sometimes it runs, but then in the browser at localhost:8000 I get this error:

Puma caught this error: Failed to open TCP connection to localhost:35729 (Cannot assign requested address - connect(2) for "localhost" port 35729) (Errno::EADDRNOTAVAIL)
/usr/local/lib/ruby/2.6.0/net/http.rb:949:in `rescue in block in connect'
/usr/local/lib/ruby/2.6.0/net/http.rb:946:in `block in connect'
/usr/local/lib/ruby/2.6.0/timeout.rb:93:in `block in timeout'
/usr/local/lib/ruby/2.6.0/timeout.rb:103:in `timeout'
/usr/local/lib/ruby/2.6.0/net/http.rb:945:in `connect'
/usr/local/lib/ruby/2.6.0/net/http.rb:930:in `do_start'
/usr/local/lib/ruby/2.6.0/net/http.rb:919:in `start'
/usr/local/lib/ruby/2.6.0/net/http.rb:1470:in `request'
/usr/local/lib/ruby/2.6.0/net/http.rb:1450:in `send_request'
/usr/local/bundle/ruby/2.6.0/gems/rack-livereload-0.3.17/lib/rack/livereload/body_processor.rb:50:in `use_vendored?'
/usr/local/bundle/ruby/2.6.0/gems/rack-livereload-0.3.17/lib/rack/livereload/body_processor.rb:101:in `livereload_source'
(erb):14:in `block (2 levels) in process!'
/usr/local/lib/ruby/2.6.0/erb.rb:901:in `eval'
/usr/local/lib/ruby/2.6.0/erb.rb:901:in `result'
/usr/local/bundle/ruby/2.6.0/gems/rack-livereload-0.3.17/lib/rack/livereload/body_processor.rb:78:in `block (2 levels) in process!'
/usr/local/bundle/ruby/2.6.0/gems/activesupport-6.0.2.2/lib/active_support/core_ext/string/output_safety.rb:283:in `block in gsub!'
/usr/local/bundle/ruby/2.6.0/gems/activesupport-6.0.2.2/lib/active_support/core_ext/string/output_safety.rb:281:in `gsub!'
/usr/local/bundle/ruby/2.6.0/gems/activesupport-6.0.2.2/lib/active_support/core_ext/string/output_safety.rb:281:in `gsub!'
/usr/local/bundle/ruby/2.6.0/gems/rack-livereload-0.3.17/lib/rack/livereload/body_processor.rb:78:in `block in process!'
/usr/local/bundle/ruby/2.6.0/gems/rack-livereload-0.3.17/lib/rack/livereload/body_processor.rb:76:in `each'
/usr/local/bundle/ruby/2.6.0/gems/rack-livereload-0.3.17/lib/rack/livereload/body_processor.rb:76:in `process!'
/usr/local/bundle/ruby/2.6.0/gems/rack-livereload-0.3.17/lib/rack/livereload.rb:28:in `_call'
/usr/local/bundle/ruby/2.6.0/gems/rack-livereload-0.3.17/lib/rack/livereload.rb:14:in `call'
/usr/local/bundle/ruby/2.6.0/gems/actionpack-6.0.2.2/lib/action_dispatch/middleware/static.rb:126:in `call'
/usr/local/bundle/ruby/2.6.0/gems/rack-2.2.3/lib/rack/sendfile.rb:110:in `call'
/usr/local/bundle/ruby/2.6.0/gems/actionpack-6.0.2.2/lib/action_dispatch/middleware/host_authorization.rb:83:in `call'
/usr/local/bundle/ruby/2.6.0/gems/webpacker-4.0.7/lib/webpacker/dev_server_proxy.rb:29:in `perform_request'
/usr/local/bundle/ruby/2.6.0/gems/rack-proxy-0.6.5/lib/rack/proxy.rb:57:in `call'
/usr/local/bundle/ruby/2.6.0/gems/railties-6.0.2.2/lib/rails/engine.rb:526:in `call'
/usr/local/bundle/ruby/2.6.0/gems/puma-4.2.1/lib/puma/configuration.rb:228:in `call'
/usr/local/bundle/ruby/2.6.0/gems/puma-4.2.1/lib/puma/server.rb:667:in `handle_request'
/usr/local/bundle/ruby/2.6.0/gems/puma-4.2.1/lib/puma/server.rb:470:in `process_client'
/usr/local/bundle/ruby/2.6.0/gems/puma-4.2.1/lib/puma/server.rb:328:in `block in run'
/usr/local/bundle/ruby/2.6.0/gems/puma-4.2.1/lib/puma/thread_pool.rb:134:in `block in spawn_thread'

Any ideas would be helpful.


OLD Issue:

Ok, so my development team and I have been pulling our hair out because we can’t figure this out. We have a Ruby on Rails application that we are trying to dockerize so that we can deploy it to either AWS or Azure.

Ruby v –> 2.7.0

Rails v –> 6.0.2.2

When we run the docker-compose up command everything runs smoothly until the bundle exec rake where it fails because Yarn executable was not detected in the system.

If I install yarn by RUN curl -o- -L https://yarnpkg.com/install.sh | bash then it fails even earlier at the line RUN bundle install --binstubs because it can’t find bundler and asks me to install it. If I try to install bundler it says that gem is not found. So, it looks like by installing yarn I get kicked out of where ruby and my gems were installed? I even tried to install yarn prior to my code of FROM ruby:2.7.0. That didn’t seem to work. It goes back to saying that yarn is not installed, even though I get a confirmation that it was.

To be honest, this is the first time I have tried to use Docker and I walked through a Udemy course, which is 4 years out of date so the versions are all different and webpacker and yarn weren’t required with the teacher’s versions.

Does anyone have information to help us? I am including our ‘Dockerfile’ and ‘docker-compose.yml’ file code below.

Dockerfile

FROM node:12.19.0
RUN curl -o- -L https://yarnpkg.com/install.sh | bash

# Use Ruby 2.7.0 version.
FROM ruby:2.7.0

# Install dependencies:
# - build-essential: To ensure certain gems can be compiled
# - nodejs: Compile assets
# - libpq-dev: Communicate with postgres through the postgres gem

RUN apt-get update && apt-get install -qq -y --no-install-recommends 
                     build-essential nodejs libpq-dev

# Set an environment variable to store where the app is installed to inside
# of the Docker image. The name matches the project name out of convention only.

ENV INSTALL_PATH /heis_soma
RUN mkdir -p $INSTALL_PATH

# This sets the context of where commands will be ran in and is documented
# on Docker's website extensively.

WORKDIR $INSTALL_PATH

# Ensure gems are cached and only get updated when they change. This will
# drastically increase build times when your gems do not change.

COPY Gemfile Gemfile

# We want binstubs to be available so we can directly call sidekiq and
# potentially other binaries as command overrides without depending on
# bundle exec.

RUN bundle install --binstubs

# Copy in the application code from your work station at the current directory
# over to the working directory.

COPY . .

# Provide a dummy DATABASE_URL to Rails so it can pre-compile assets.

RUN bundle exec rake RAILS_ENV=production DATABASE_URL=postgresql://user:[email protected]/dbname SECRET_TOKEN=dummytoken assets:precompile

# Ensure the static assets are exposed through a volume so that nginx can read
# in these values later.

VOLUME ["$INSTALL_PATH/public"]

# The default command that gets ran will be to start the Puma server.

CMD bundle exec puma -C config/puma.rb

docker-compose.yml

version: '2'

services:
  postgres:
    image: postgres:12.4
    environment:
      POSTGRES_USER: heis_soma
      POSTGRES_PASSWORD: yourpassword
    ports:
      - '5432:5432'
    volumes:
      - postgres:/var/lib/postgresql/data

  redis:
    image: redis:6.0.8
    ports:
      - '6379:6379'
    volumes:
      - redis:/var/lib/redis/data

  heis_soma:
    build: .
    ports:
      - '8000:8000'
    volumes:
      - .:/heis_soma
    env_file:
      - .heis_soma.env

  sidekiq:
    build: .
    command: bundle exec sidekiq
    volumes:
      - .:/heis_soma
    env_file:
      - .heis_soma.env

volumes:
  redis:
  postgres:

Thank you so much in advance for your assistance. I am sorry if this was posted in the wrong spot. I did try to find the right forum.

Source: Dockerfile Questions

LEAVE A COMMENT