Skip to content

Instantly share code, notes, and snippets.

@andrius
Last active Feb 14, 2022
Embed
What would you like to do?
How to dockerize #rails app with #puma. Edit config/application.rb and config/puma.rb #docker #ruby
module YourApplicationName
class Application < Rails::Application
# ...
# We want to set up a custom logger which logs to STDOUT.
# Docker expects your application to log to STDOUT/STDERR and to be ran
# in the foreground.
config.log_level = ENV.fetch('LOG_LEVEL', :debug)
config.log_tags = [:subdomain, :uuid]
config.logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
# ...
end
end
api: bundle exec puma -C config/puma.rb
# Before configuring Puma, you should look up the number of CPU cores your server has, change this to match your CPU core count
workers Integer(ENV['WEB_CONCURRENCY'] || [1, `grep -c processor /proc/cpuinfo`.to_i].max)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
# HTTP interface
port 3000
# HTTPS inteface
# How to generate certificate: https://gist.github.com/tadast/9932075
ssl_bind '0.0.0.0', '3001', { key: 'ssl/server.key', cert: 'ssl/server.crt' }
environment ENV['RACK_ENV'] || 'development'
stdout_redirect(stdout = '/dev/stdout', stderr = '/dev/stderr', append = true)
on_worker_boot do
# Worker specific setup for Rails 4.1+
# See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot
ActiveRecord::Base.establish_connection
end
@andrius
Copy link
Author

andrius commented May 31, 2020

Many months ago :) Perhaps answer is not relevant, anyways:

docker want us to run a single process, with ruby I do not see any problem, just run two instances in this case, i.e.:

Shared code with all the models, classes and controllers in Dockerfile.base:

FROM ruby:BLAH

WORKDIR /app

COPY . .

RUN bundle install

GUI Dockerfile.gui:

FROM base
CMR ["bundle", "exec", "rails", "server", "0.0.0.0"]

Workers Dockerfile.workers:

FROM base
CMR ["bundle", "exec", "sidekiq", "... args ..."]
docker build --pull --force-rm -t base --file ./Dockerfile.base .
docker build --pull --force-rm -t gui --file ./Dockerfile.gui .
docker build --pull --force-rm -t workers --file ./Dockerfile.workers .

So then we can run them separately. There is more options, i.e. we can use supervisord to handle multiple processes with docker, i.e. based on this example.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment