| # docker-build: build your software with docker |
| |
| ## Description |
| |
| docker-build is a script to build docker images from source. It will be deprecated once the 'build' feature is incorporated into docker itself (See https://github.com/dotcloud/docker/issues/278) |
| |
| Author: Solomon Hykes <solomon@dotcloud.com> |
| |
| |
| ## Install |
| |
| docker-builder requires: |
| |
| 1) A reasonably recent Python setup (tested on 2.7.2). |
| |
| 2) A running docker daemon at version 0.1.4 or more recent (http://www.docker.io/gettingstarted) |
| |
| |
| ## Usage |
| |
| First create a valid Changefile, which defines a sequence of changes to apply to a base image. |
| |
| $ cat Changefile |
| # Start build from a know base image |
| from base:ubuntu-12.10 |
| # Update ubuntu sources |
| run echo 'deb http://archive.ubuntu.com/ubuntu quantal main universe multiverse' > /etc/apt/sources.list |
| run apt-get update |
| # Install system packages |
| run DEBIAN_FRONTEND=noninteractive apt-get install -y -q git |
| run DEBIAN_FRONTEND=noninteractive apt-get install -y -q curl |
| run DEBIAN_FRONTEND=noninteractive apt-get install -y -q golang |
| # Insert files from the host (./myscript must be present in the current directory) |
| copy myscript /usr/local/bin/myscript |
| |
| |
| Run docker-build, and pass the contents of your Changefile as standard input. |
| |
| $ IMG=$(./docker-build < Changefile) |
| |
| This will take a while: for each line of the changefile, docker-build will: |
| |
| 1. Create a new container to execute the given command or insert the given file |
| 2. Wait for the container to complete execution |
| 3. Commit the resulting changes as a new image |
| 4. Use the resulting image as the input of the next step |
| |
| |
| If all the steps succeed, the result will be an image containing the combined results of each build step. |
| You can trace back those build steps by inspecting the image's history: |
| |
| $ docker history $IMG |
| ID CREATED CREATED BY |
| 1e9e2045de86 A few seconds ago /bin/sh -c cat > /usr/local/bin/myscript; chmod +x /usr/local/bin/git |
| 77db140aa62a A few seconds ago /bin/sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -q golang |
| 77db140aa62a A few seconds ago /bin/sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -q curl |
| 77db140aa62a A few seconds ago /bin/sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -q git |
| 83e85d155451 A few seconds ago /bin/sh -c apt-get update |
| bfd53b36d9d3 A few seconds ago /bin/sh -c echo 'deb http://archive.ubuntu.com/ubuntu quantal main universe multiverse' > /etc/apt/sources.list |
| base 2 weeks ago /bin/bash |
| 27cf78414709 2 weeks ago |
| |
| |
| Note that your build started from 'base', as instructed by your Changefile. But that base image itself seems to have been built in 2 steps - hence the extra step in the history. |
| |
| |
| You can use this build technique to create any image you want: a database, a web application, or anything else that can be build by a sequence of unix commands - in other words, anything else. |
| |