A development environment for Rails applications using docker.
Tested on Linux and Mac OS X.
Musophobia? Read on:
brew tap phinze/homebrew-cask
brew install brew-cask
brew cask install virtualbox
brew cask install boot2docker
brew install docker
# Install docker
curl -sL https://get.docker.io/ | sudo sh
sudo adduser $USER docker
git clone https://github.com/gewo/living-in-a-box.git $HOME/.living-in-a-box
export PATH="~/.living-in-a-box/bin:$PATH" # you want to make this permanent
First you want to start the background services, that is:
On OSX a the boot2docker VM will be started for the docker daemon, which is not available on OSX.
# Start it up. On the first run it will pull all the necessary images
# from the docker registry.
dev start
From your project folder just run:
dev shell
This will open a bash shell inside the docker container with the
background services linked to it. The /mnt
-folder inside the container
is synced to your current path.
An example:
$ cd /path/to/project
$ dev shell
docker$ cd /mnt # equals /path/to/project on the host
docker$ bundle install
docker$ bundle exec rake db:create db:schema:load db:migrate db:seed
docker$ bundle exec rails server
docker$ exit
$
Data in the background-services will be persisted in Data Volumes.
Normally the containers port is mapped to a random port on your host
machine. You can specify the PORT
environment variable to use a fixed
one:
$ dev shell # port 3000 forwarded to 0.0.0.0:49157
$ PORT=3456 dev shell # port 3000 forwarded to 0.0.0.0:3456
When setting SYNC_DOTFILES=1
a few of your favorite dotfiles are
bind-mounted inside the container and your shell is set to zsh if that's
also your current $SHELL
.
When you want to specify custom files that should be synced into your
containers home directory you can set the DOTFILES
environment
variable.
$ SYNC_DOTFILES=1 dev shell # sync default dotfiles
$ SYNC_DOTFILES=1 DOTFILES=".ctags" dev shell # sync your `~/.ctags`
Set the shell to use in your container.
$ SHELL=fish dev shell
docker <><
Sometimes you may want to pass additional arguments to the docker run
command.
Lets say you want to forward the Redis port to your local system:
$ EXTRA_ARGS="--publish 127.0.0.1:9736:6379" dev shell
docker$
# another shell on your host
$ redis-cli -p 9736 INFO | grep redis_version
redis_version:2.6.15
$
Per default dev shell uses the gewo/ruby image. Some guessing is done to automatically find out the correct version of ruby from your Gemfile. Sometimes you want to specify the version manually:
$ RUBY_VER=1.9.3 dev shell
docker$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]
docker$
The docker image. IMAGE
by default is the latest ruby image.
$ IMAGE=gewo/ruby:1.9.3 dev shell
docker$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]
docker$
Set version of background services on dev start
$ # Run the mongodb server with image gewo/mongodb:2.4.10. Other images
$ # use :latest per default.
$ MONGODB_VER=2.4.10 dev start
dev shell [IMAGE]
IMAGE
by default is the latest ruby image.
Example
$ dev shell gewo/node
docker$ nodejs -v
v0.10.29
docker$
A lot.