Search code examples
ruby-on-railsdockerdocker-composebundlerrails-engines

The path `/app/include/engine` does not exist. (Bundler::PathError)


I am dockerizing my rails app with the mountable engine. But I am constantly getting one error while running the image The path `/app/include/engine` does not exist.

The image is successfully built but while running docker-compose up it throws an error of the path.

Below I am attching my Dockerfile and docker-compose.yml

Dockerfile

FROM ruby:2.4.1
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
COPY . .
RUN mkdir -p /app/include/engine
RUN git clone git@github.com:engine/engine.git /app/include/engine
RUN ls
RUN ls /app/include/engine
RUN DISABLE_SSL=true gem install puma -v 3.6.0
RUN bundle check ||  bundle install

CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yml

version: '2'
services:
  db: 
    image: mysql:8.0.21
    restart: always
    environment:
        MYSQL_ROOT_PASSWORD: root@123
        MYSQL_DATABASE: prod
        MYSQL_USER: root
        MYSQL_PASSWORD: root@123
    ports:
        - "3307:3306"
  app: 
    build:
      context: .
      dockerfile: Dockerfile
      args:
          SSH_PRIVATE_KEY: ${SSH_PRIVATE_KEY}
    volumes: 
        - ".:/app"
    ports: 
        - "3000:3000"
    depends_on:
        - db
    environment:
        key: value

I have also included my engine path in Gemfile and followed all the steps in mounting engine

# engine
gem 'api', path: 'include/engine'

It works fine in the local environment but it gives me an error in docker.

Can someone please help what I m missing somewhere?


Solution

  • it because of this line

      volumes: 
        - ".:/app"
    

    This mounts your local dir inside the container when starting overwriting existing data already in the image. This means everything in /app is replaced with data from your local machine including your engine /app/include/engine.

    To fix this you need to have this engine cloned in your local folder so it is available when starting the container. An other option is to clone the engine outside /app for example in /tmp or whatever you like.