Cloud Foundry can be wonderfully simple to use for 99% of web applications. It is now even more wonderful and more simple by allowing us to install Debian packages. Cloud Foundry containers do not grant root access, so installing Debian packages has not been possible. But it now is with the apt buildpack.
With or without extra Debian packages, deploying Cloud Foundry applications is always simple:
So easy. So delightful.
1% of the time, my application has some niche dependency. A package that isn't pre-installed on the base image of a Cloud Foundry container or a dependency that the buildpack doesn't natively support.
For example, I wanted to build a mini admin UI for some BOSH environments. The BOSH director does have an API, but there is only a formal client library in Golang. Fortunately, the
bosh CLI is fast and most commands have JSON output.
I realized I could get a long way by writing my UI in Ruby on Rails and invoke the
bosh CLI to interact with a BOSH director.
Even better, the
bosh CLI uses environment variables for targeting and authentication -- which matches perfectly with how Cloud Foundry likes to configure its running applications.
Here's an example of a Ruby application that uses a Debian packaged version of the
bosh CLI, and hidden environment variables for configuration, to interact with a BOSH environment.:
Conveniently, I had packaged the
bosh CLI as a Debian package recently. All I needed was a way to install my bespoke Debian package from my bespoke https://apt.starkandwayne.com/ Debian repository as part of
Fortunately, Cloud Foundry now has an apt buildpack to make this very easy to combine.
Any Cloud Foundry application can now have any Debian package installed during the
cf push staging sequence. The installed packages (and their nested dependencies) will be baked into the droplet and will be consistent across every instance of the application.
Step 1. The apt.yml file.
For my demo app I needed the
bosh-cli package from https://apt.starkandwayne.com to be installed during
All I need to create is an
--- keys: - https://raw.githubusercontent.com/starkandwayne/homebrew-cf/master/public.key repos: - deb http://apt.starkandwayne.com stable main packages: - bosh-cli
apt.yml file corresponds to the https://apt.starkandwayne.com instructions:
wget -q -O - https://raw.githubusercontent.com/starkandwayne/homebrew-cf/master/public.key | apt-key add - echo "deb http://apt.starkandwayne.com stable main" | tee /etc/apt/sources.list.d/starkandwayne.list apt-get update apt-get install bosh-cli
The primary difference, aside from syntax, is that Cloud Foundry applications do not have root access, so I cannot simply
apt-get install packages. The
apt-buildpack installs packages into a location
Step 2. Using multiple buildpacks
apt buildpack is not the only buildpack we need. My app is a Ruby app. It needs the standard
ruby buildpack too.
All modern Cloud Foundry distributions will have two ways to use multiple buildpacks: a
cf push method and
cf v3-push method.
I've written up both sets of instructions in the demo application README.
cf push only allows a single buildpack - so you use https://github.com/cloudfoundry/multi-buildpack/. You then create a
multi-buildpack.yml file to specify the ordered set of buildpacks.
buildpacks: - https://github.com/cloudfoundry/apt-buildpack - https://github.com/cloudfoundry/ruby-buildpack
NOTE: The last buildpack must be the runtime buildpack.
cf v3-push natively supports multiple buildpacks. You provide the ordered list as flags:
cf v3-push bosh-cli-web-demo \ -b https://github.com/cloudfoundry/apt-buildpack \ -b ruby_buildpack
Again, the final buildpack must be buildpack that will initialize and run the web application.
Watch Keaty Gross at Cloud Foundry Summit Basel 2017 to learn more about multi-buildpack, apt-buildpack, and the future of Cloud Foundry!