1

I am trying to reuse existing cookbooks within docker containers, but most recipes will start the service during the chef client run (e.g. tomcat, apache2). As chef-solo runs during image creation the chef run will simply fail.

How can I prevent a cookbook from starting a service?

I am using the following Dockerfile

FROM jr42/chef-solo-centos

ADD chef /chef
RUN cd /chef && /opt/chef/embedded/bin/berks vendor /chef/cookbooks
RUN chef-solo -N mynode -c /chef/solo.rb -j /chef/solo.json

tomcat in my runbook (solo.json):

{
  "tomcat": {
    "base_version": ""
  },
  "run_list": [ "recipe[tomcat]" ]
}

and Berksfile:

source "https://supermarket.getchef.com"
metadata
cookbook 'tomcat'
jr42
  • 13
  • 4

1 Answers1

0

It appears that you are using the cookbook with unmodified attributes, and the default behavior of the tomcat cookbook is to run a 'default' base tomcat instance.

Refer to the resource declared here and the attribute setting here.

You should be able to update your solo.json to override this attribute:

{
  "tomcat": {
    "base_version": "",
    "run_base_instance": false
  },
  "run_list": [ "recipe[tomcat]" ]
}

And you shouldn't have the service automatically start.

Alternately, you could look at the chef-container project documentation and see if this maps to a better build procedure for your containerized application.

Mike Fiedler
  • 2,152
  • 1
  • 17
  • 33
  • Thanks for the answer. It solves the issue with the tomcat cookbook. Is there no general way to prevent service start, stops and restarts? I have similar issues with almost every cookbook during "docker build". This includes chef-container – jr42 Oct 06 '14 at 09:25
  • @jr42 Many cookbook maintainers assume that the desired state of a recipe is that a service be started when the "thing" is configured - not exactly docker-friendly. You _could_ try looking at something like chef-rewind's `unwind` to remove particular resources - but this is a tricky thing to get right. – Mike Fiedler Oct 06 '14 at 15:54