Automatically generated and up-to-date Docker combo images
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Build Status

Docker Combos

Automatically generated and up-to-date Docker combo images of useful official images like Python and Node.

$ docker run combos/python_node:3_8 python --version
Python 3.6.2
$ docker run combos/python_node:3_8 node --version

The generated combo images are:

  • Always up-to-date
  • Using the exact Dockerfile as the official images (with minor modifications to facilitate combining two images into one)
  • Transparently generated using the source code in this repository
  • Pushed to Docker Hub using where you can verify the process


  1. Find your language Combo on Docker Hub.
  2. Find your desired version combo in the Tags tab.
  3. Use like any other Docker image (e.g. docker run combos/python_node:3_8 python -c "print('hello world!')")
  4. Rest assured the image will always have the latest language versions

Why is this needed?

Complex projects sometimes require more than one language to run. Examples include Serverless with Python runtime, or Django with Yuglify. Current solutions are to build the combined image yourself which slows the build process, or using a one-off outdated image from Docker Hub created by someone who was in a similar situation a few months ago.

How does it work?

A cron job is running daily on and checks if one of the source images in the combos was updated upstream. If its build date is newer than our combo's build date, a new image is built and pushed to Docker Hub. To build the image the Dockerfile of both source images are combined by keeping just one FROM line and removing all CMD and ENTRYPOINT lines. The system also verifies that the same FROM line is used on both source images to prevent any conflicts.

Requesting More Combos

To add more combos to be built every day, submit a PR with modifications to .travis.yml. Add another line at the bottom of the file with the format:

- "I1=image:tag I2=image:tag"

So if you wanted to add support for Ruby 2.3 and Node 7 running on Alpine, you'd use:

- "I1=ruby:2.3-alpine I2=node:7-alpine"

Some PR Rules:

  • All combos must be of commonly used images
  • All images must be official and ideally officially supported by Docker itself
  • Try to stick to big version scopes (Python 2 instead Python 2.7.11)
  • FROM line of both images must be identical


Why are you using instead of Docker Hub to build? has support for daily builds so we can keep the images up-to-date. Docker Hub requires a branch per build and doesn't support Dynamic Dockerfile generation.