EZBake - A new way to converge docker containers with chef
May 13, 2014
EZ Bake
came from an idea I had while watching the HangOps episode 2014-04-11 in which they were talking about Docker
and Config Management being complementary rather than adversary.
I have expermented with using Chef
and Docker
together in the past but wanted to tackle the problem from a slightly different angle. I’ve recently been working on some PAAS stuff, both Deis and Solum these both utilize the tooling from Flynn which builds heroku style buildpacks
in Docker
.
EZ Bake takes chef recipes designed for chef-solo
( but could easily be extended to do the same for chef-zero
, or chef-client
with a server) in a tarball via stdin
and converges a docker node using that recipe.
This methodology seems a little weird at first, but it gives you the ability to ship your Chef cookbooks as self-contained tarballs, or even more interestingly use the git archive
command from your git repository to do this automatically and then pipe that directly to the docker run
command.
In order to recognize and run your cookbook ( or repo ) it needs to contain the following files: Berksfile
, solo.json
, solo.rb
in the root of your cookbook. There is some provision for providing different locations for these via environment variables. This is pre-ChefDK and will probably become easier with ChefDK.
I have provided an example in the ezbake repo that will install Java7 in the container.
This example shows:
- Converging a container using a local chef recipe
- Committing the container to an image on completion
- Removing the build container
- Running the new image
$ git clone paulczar/ezbake
$ cd ezbake/examples
$ ID=$(tar cf - . | sudo docker run -i -a stdin paulczar/ezbake) \
&& sudo docker attach $ID \
&& sudo docker commit $ID java7
&& sudo docker rm $ID
Running Berkshelf to collect your cookbooks:
Installing java (1.22.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Converging your container:
[2014-04-12T22:10:24+00:00] INFO: Forking chef instance to converge...
....
[2014-04-12T22:16:52+00:00] INFO: Chef Run complete in 154.563192281 seconds
[2014-04-12T22:16:52+00:00] INFO: Running report handlers
[2014-04-12T22:16:52+00:00] INFO: Report handlers complete
$ sudo docker run -t java7 java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
This could easily be built into a CI pipeline. a git webhook could call jenkins which would clone the repo and then use a command like git archive master | docker run -i -a stdin paulczar/ezbake
to converge a container from it.
It could also very easily be used in Deis
or Solum
as an alternative to a Heroku buildpack.