Last active
July 22, 2022 22:00
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
api: bundle exec puma -C config/puma.rb |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
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
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
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