Skip to content

Instantly share code, notes, and snippets.

@andrius
Last active July 22, 2022 22:00
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save andrius/7c26a8deef10f3105a136f958b0d582d to your computer and use it in GitHub Desktop.
Save andrius/7c26a8deef10f3105a136f958b0d582d to your computer and use it in GitHub Desktop.
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 Jul 7, 2019

Any thoughts on Delayed::Jobs?

Thing that within docker such things as Sidekiq, Que or delayed jobs should be running within another container as a separate process, that's how docker suggest to manage things (one process in container), so

FROM andrius/alpine-ruby

# all the stuff you want to add

CMD ["bundle", "exec", "some_delayed_job_application"]

@kuyseng
Copy link

kuyseng commented Jan 22, 2020

Hi @andrius. Could help to share Dockerfile to build image? And i'm not sure multiple workers can run in single docker process. Help to explain too. Thanks in advance

@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