To run a Ruby on Rails app on Ubuntu, you will need to install several packages:
build-essential
: provides essential tools like GCC and make for compiling and building C/C++ applications.curl
: used to transfer data from or to a server.libssl-dev
: provides the SSL development libraries used by some gems.libreadline-dev
: provides the readline development libraries used by some gems.zlib1g-dev
: provides the zlib development libraries used by some gems.libxml2-dev
: provides the XML development libraries used by some gems.libxslt1-dev
: provides the XSLT development libraries used by some gems.imagemagick
: used to process images uploaded to your application.nodejs
: provides the JavaScript runtime environment required by Rails for asset compilation and JavaScript execution.yarn
: package manager used for JavaScript dependencies in the Rails asset pipeline.
To install all of these packages on Ubuntu, you can run the following command:
sudo apt-get update && sudo apt-get install -y build-essential curl libssl-dev libreadline-dev zlib1g-dev libxml2-dev libxslt1-dev imagemagick nodejs yarn
# Use the latest Alpine image as the base
FROM alpine:latest
# Install required packages for Ruby on Rails
RUN apk add --no-cache \
build-base \
nodejs \
yarn \
tzdata \
git \
postgresql-dev \
imagemagick \
openssl \
less \
file
# Set the working directory to /app
WORKDIR /app
# Copy the Gemfile and Gemfile.lock into the container
COPY Gemfile Gemfile.lock ./
# Install RubyGems and Bundler
RUN apk add --no-cache ruby ruby-dev ruby-rdoc ruby-irb ruby-bigdecimal && \
gem install bundler --no-document
# Install the RubyGems specified in the Gemfile
RUN bundle install
# Copy the rest of the application code into the container
COPY . .
# Expose port 3000
EXPOSE 3000
# Start the Rails server
CMD ["rails", "server", "-b", "0.0.0.0"]
Save this as a file named
Dockerfile
. You can then build the Docker image by running the following command in the same directory as the Dockerfile
:docker build -t myapp .
This will build a Docker image tagged as
myapp
using the instructions in the Dockerfile
.To install Ruby 3.0 on Alpine, you can use the following Dockerfile:
FROM alpine:latest
RUN apk update && \
apk add --no-cache \
build-base \
nodejs \
yarn \
tzdata \
postgresql-dev \
postgresql-client \
ruby \
ruby-dev \
ruby-json \
ruby-etc \
ruby-bigdecimal \
ruby-webrick \
libffi-dev \
openssl-dev \
libc-dev \
curl && \
rm -rf /var/cache/apk/*
RUN gem install bundler -v '>= 2.1.4'
RUN apk add --update --no-cache --virtual=.build-dependencies curl && \
apk add --update --no-cache ruby ruby-dev ruby-irb ruby-rdoc ruby-etc ruby-bigdecimal && \
curl -sSL https://rvm.io/mpapis.asc | gpg --import - && \
curl -sSL https://rvm.io/pkuczynski.asc | gpg --import - && \
curl -sSL https://get.rvm.io | bash -s stable --ruby=3.0 && \
apk del .build-dependencies && \
rm -rf /var/cache/apk/*
ENV PATH="/usr/local/rvm/gems/ruby-3.0.0/bin:/usr/local/rvm/gems/ruby-3.0.0@global/bin:/usr/local/rvm/rubies/ruby-3.0.0/bin:${PATH}"
RUN gem install bundler -v '>= 2.1.4'
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY . .
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
docker build -t <image-name> .
docker run -it <image-name>
Run tests:
FROM alpine:3.15
# Install packages
RUN apk add --update --no-cache \
build-base \
git \
nodejs \
yarn \
postgresql-dev \
tzdata \
ruby=3.0.3-r0 \
ruby-dev=3.0.3-r0 \
ruby-json=3.0.3-r0 \
ruby-bundler=2.2.29-r0
# Set timezone
RUN ln -sf /usr/share/zoneinfo/UTC /etc/localtime && \
echo "UTC" > /etc/timezone
# Set working directory
WORKDIR /app
# Copy Gemfile and Gemfile.lock
COPY Gemfile Gemfile.lock ./
# Install gems
RUN bundle install --jobs "$(nproc)" --retry 5
# Copy application files
COPY . .
# Run tests
CMD ["rspec"]
$ docker build -t myapp .
$ docker run myapp
See the output of running the tests:
docker run -it <image-name> rspec
FROM alpine:latest
RUN apk update && apk add --no-cache \
build-base \
libxml2-dev \
libxslt-dev \
postgresql-dev \
tzdata \
nodejs \
yarn \
ruby=3.0.0-r0 \
ruby-dev \
ruby-etc \
ruby-io-console \
ruby-bigdecimal \
openssl \
ca-certificates \
curl \
git
WORKDIR /app
COPY . .
RUN gem install bundler
RUN bundle install
CMD ["bin/server", "-f"]
FROM ruby:3.0-alpine
RUN apk add --update --no-cache \
build-base \
postgresql-dev \
tzdata \
nodejs \
yarn
WORKDIR /app
COPY Gemfile* ./
RUN bundle install
COPY . .
RUN bundle exec rails assets:precompile
CMD ["bin/server", "-f"]
RUN bundle exec RAILS_ENV=test rails db:seed
FROM alpine:latest
# Install system dependencies
RUN apk add --update --no-cache \
bash \
build-base \
ca-certificates \
curl \
git \
libffi-dev \
libxml2-dev \
libxslt-dev \
linux-headers \
mariadb-dev \
nodejs \
openssl-dev \
ruby \
ruby-bigdecimal \
ruby-bundler \
ruby-dev \
ruby-io-console \
tzdata \
redis
# Install MySQL client
RUN apk add --no-cache mysql-client
# Install Ruby 3.0
RUN apk add --update --no-cache \
--virtual .ruby-builddeps \
autoconf \
bison \
bzip2 \
bzip2-dev \
ca-certificates \
coreutils \
dpkg-dev dpkg \
gcc \
gdbm-dev \
glib-dev \
libc-dev \
libffi-dev \
libressl \
libressl-dev \
libxml2 \
libxml2-dev \
libxslt \
libxslt-dev \
linux-headers \
make \
ncurses-dev \
openssl \
openssl-dev \
procps \
readline-dev \
ruby \
tar \
xz \
yaml-dev \
zlib-dev && \
git clone https://github.com/rbenv/ruby-build.git /usr/src/ruby-build && \
cd /usr/src/ruby-build && \
./install.sh && \
rm -rf /usr/src/ruby-build && \
ruby-build 3.0.4 /usr/local && \
gem update --system && \
gem install bundler && \
apk del .ruby-builddeps
# Set the working directory
WORKDIR /app
# Copy the application files
COPY . .
# Install the application dependencies
RUN bundle config set deployment 'true'
RUN bundle install --without development test
# Start Redis and MySQL
RUN redis-server --daemonize yes && \
/usr/bin/mysqld_safe --datadir='/var/lib/mysql' & \
sleep 5
# Run database migrations and seed the database
RUN bundle exec rake db:create && \
bundle exec rake db:migrate && \
bundle exec rake db:seed
# Start the Rails server
CMD ["bundle", "exec", "bin/rails", "server", "-b", "0.0.0.0"]
# Use Alpine as the base image
FROM alpine:3.14
# Install packages required for Ruby and Rails
RUN apk add --update --no-cache \
bash \
build-base \
git \
nodejs \
nodejs-npm \
openssl-dev \
postgresql-dev \
readline-dev \
tzdata \
yaml-dev \
yarn \
zlib-dev
# Install Redis and MySQL
RUN apk add --update --no-cache redis mysql mysql-client
# Install Ruby 3.0
RUN apk add --update --no-cache ruby ruby-dev && \
gem install bundler --no-document && \
bundle config --global frozen 1
# Set the working directory
WORKDIR /app
# Copy the Gemfile and Gemfile.lock into the container
COPY Gemfile Gemfile.lock ./
# Install gems
RUN bundle install --jobs=4 --retry=3
# Copy the application code into the container
COPY . .
# Run database migrations and seed data
RUN bundle exec rails db:migrate && \
bundle exec rails db:seed RAILS_ENV=test
# Run tests
CMD ["bundle", "exec", "rspec"]