DockerComposeEnv
Simplify configuration between Docker Compose and Ruby/Rails apps in development.
If you run Rails outside of Docker, this helps your application play be a better first class citizen with your dev machine by utilizing dynamic port mapping in Docker Compose services.
To read more about the problems this gem solves, check out the Why Does This Exist? documentation.
If your team is comfortable running Rails inside a container or you are looking for a production solution for service discovery, this is not what you want.
Installation / Usage
For a Rails app, add this gem to your Gemfile in the development / test groups.
group :development, :test do
gem 'docker_compose_env_rails'
end
You will now have new ENV
properties set from the docker-compose.yml
file
in your project directory. The following compose config would assign
ENV['DB_HOST']
and ENV['DB_PORT_5432']
to the values returned
from running docker-compose port db 5432
, the host and dynamically mapped
port assigned after you ran docker-compose up
.
version: '3.3'
services:
db:
image: postgres:9.6-alpine
env_file: .env
ports:
- "5432"
That means your Rails config/database.yml
file could look like:
default: &default
adapter: postgresql
encoding: unicode
host: <%= ENV['DB_HOST'].to_i %>
password: example
pool: 5
port: <%= ENV['DB_PORT_5432'].to_i %>
username: postgres
development:
<<: *default
database: app
test:
<<: *default
database: app_test
Load Faster!
If you need to load the dynamic port information faster than the
before_configuration
call in Railties
, you can add the docker_compose_env
gem higher up in the Gemfile
and load it with a special require path:
gem `docker_compose_env`, require: 'docker_compose_env/now'
Further Customization
Unfortunately, there's only so much automagic that can be done. If you need to
customize the docker-compose.yml
file name or location, or if you'd like to
collect the dynamic information somewhere besides ENV
, you will need to
require the docker_compose_env
gem and set it up yourself.
# expects docker-compose.yml file and adds values to ENV
DockerComposeEnv.setup!
# customize docker-compose.yml path and adds values to ENV
DockerComposeEnv.setup!(file: 'docker/docker-compose.dev.yml')
# add dynamic values to custom object instead of ENV
config = {}
DockerComposeEnv.setup!(env: config)
puts config
# add dynamic values to custom object instead of ENV and custom compose path
config = {}
DockerComposeEnv.setup!(env: config, file: 'custom/path.yml')
puts config
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run
rake test
to run the tests. You can also run bin/console
for an interactive
prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To
release a new version, update the version number in version.rb
, and then run
bundle exec rake release
, which will create a git tag for the version, push
git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/CoffeeAndCode/docker_compose_env.