Small utility to streamline dev process with Docker on OS X (Boot2Docker/Docker Machine) and Linux
Ruby
Latest commit 94c474d Jan 17, 2016 @gansbrest Update README.md
Permalink
Failed to load latest commit information.
LICENSE Added LICENSE file Oct 20, 2014
README.md Update README.md Jan 17, 2016
hodor Move host-manager section to proper location Nov 19, 2015

README.md

hodor

Small utility to streamline dev process with Docker on OS X (Boot2Docker/Docker Machine) and Linux

Blog posts with more info:

features

  • same workflow for Linux and OS X
  • volume sharing support for current project dir (with unison and fswatch to keep host and VM in sync)
  • exposed docker ports are automatically mapped to your host, it just works (VirtualBox only)
  • ssh key sharing support between host and containers (ex: pull from github inside of the container without typing ssh key passwords)
  • containers orchestration with deps management, so we can start containers in particular order
  • separate containers list per project (with .hodorfile)

Hodor Hodor Hodor

unsupported

  • Windows OS
  • docker-compose toolchain

PRs, suggestions, and contributions are welcomed.

requirements

  • ruby >= 1.9.3
  • docker / boot2docker >= v1.1.2 / docker-machine
  • unison = 2.40.x (for two-way sync on OS X, not required for Linux)
    • brew install homebrew/versions/unison240
  • fswatch >= 1.4.3.1 (for automatic volumes sync on project file change on OS X, not required for Linux)
    • brew install fswatch.
    • Make sure you fswatch version has -o option (--one-per-batch option). If it's missing, you will need the newer version.

how to use

First you need to clone this repo, chmod +x hodor and copy hodor script to /usr/local/bin

In your project create file called .hodorfile (now processed through ERB) with following structure ( I'll explain options later, but everything should be pretty obvious from this example file:

# (Optional. Default: boot2docker)
host-manager: docker-machine 
# (Optional. VirtualBox vm name. 
#    Defaults: boot2docker-vm (boot2docker), default (docker-machine))
host: default

containers:
  redis:
    background: true
    image: gansbrest/redis
    ports: -P
    onetime: false
    volumes:
      __PROJECT__/conf: /data/conf
  jetpack:
    background: false
    image: gansbrest/fc_jetpack
    ports:
      - 49000:8880
    # (**note:** if you use `net: host`, but still want to start conainers in 
    # particular order, you should use **depends** keyword with the list of continers instead)
    links:
      redis: redis
    environment:
      AWS_ACCESS_KEY_ID: <%= ENV['AWS_ACCESS_KEY_ID'] %>
      AWS_SECRET_ACCESS_KEY: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
    workdir: "/data"
    onetime: true

tasks:
  test:
    sync_project_to: /data/slot-fc1
    cmd: "cd /data/slot-fc1 && bash"
    container: "jetpack"
  npm:
    sync_project_to: /data/slot-fc1
    cmd: "cd /data/slot-fc1 && npm"
    container: "jetpack"
  grunt:
    sync_project_to: /data/slot-fc1
    cmd: "cd /data/slot-fc1 && grunt"
    container: "jetpack"
  run:
    sync_project_to: /data/slot-fc1
    cmd: "cd /data/slot-fc1 && ./simple_server"
    container: "jetpack"
  default: run #(if no task is given, the run task is executed)

Run hodor with one of the tasks you specified while you are in project dir.

For example hodor grunt build - it will execute grunt build inside of the container and auto sync your host and VM after it's done!

or

hodor run - will run simple_server (which in the above example is a wrapper for nodemon and some other stuff) inside of the container. You will see nodemon output. Any files modified on host will automatically sync to container because of fswatch!

This project is very raw. Report any issues, questions or suggestions.

Hope it will save you time and allow to fully enjoy docker!

why not fuse or VirtualBox Guest Additions?

Fuse is just very slow for big projects and inconvenient to setup. VirtualBox Guest Additions is, well, slow. I was not able to use it for our project with 17k small files.. Some people find it useful for small projects though and it's backed into new Boot2Docker, or that I've heard.

why not Vagrant, it does it all already?

Well, let me put it this way: I tried Vagrant and it wasn't good for I needed. I just felt that everything was too abstracted away. Plus file sharing is slow and not even sure for ssh forwarding. Also not a fan of installing sshd on my containers.

Not that I advice against using it, I just felt that I need something different and lightweight.

Read more here:

Docker and Vagrant: http://stackoverflow.com/questions/16647069/should-i-use-vagrant-or-docker-io-for-creating-an-isolated-environment

SSHD in your containers: http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/

motivation

Once I started working with Docker, my initial reaction was, "Hey, that's great, everything just works and I can even share my volumes and ports with host machine easily..."

I forgot to mention that I use Ubuntu as my desktop OS... So I spent about a week to create multiple containers for our FastCompany stack (node, redis etc) and decided to convince our devs to integrate Docker as part of the new development process. Everything was supposed to be so much better. Boy, was I surprised.

Most of our dev team members use Mac OS X. I always knew that. I think I was just misled by Docker docs, where they would say "It works everywhere, even on Windows! You just need this tiny VM to make it all happen." Well, let me make it short for you - Docker is PAIN in the b..t when you want to share volumes or ports, basically use it indirectly through any particular VM.

I decided to create this tool called Hodor with one goal in mind - to create reliable helper/proxy, which allows to use of Docker same way on Linux or OS X, where volume sharing and ports are just working.