Skip to content

Instantly share code, notes, and snippets.

@colstrom
Last active December 9, 2016 19:59
Show Gist options
  • Save colstrom/ed99ee15e85b25fdff0517e1bac45a31 to your computer and use it in GitHub Desktop.
Save colstrom/ed99ee15e85b25fdff0517e1bac45a31 to your computer and use it in GitHub Desktop.
docker-flatten-image.sh: flattens docker images
#!/bin/sh
# The MIT License (MIT)
# Copyright (c) 2016 Chris Olstrom <chris@olstrom.com>
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
set -o errexit -o nounset -o pipefail -o xtrace
NAMESPACE=${NAMESPACE:-$(pwd | xargs dirname | xargs basename)}
IMAGE=${IMAGE:-$(pwd | xargs basename)}
REPOSITORY=${NAMESPACE}/${IMAGE}
stage1() {
docker build -t ${REPOSITORY}:stage1 .
STAGE1=$(docker images | awk "\$1 == \"${REPOSITORY}\" && \$2 == \"stage1\" { print \$3 }" | head -n 1)
}
stage2() {
docker run --entrypoint /bin/true ${STAGE1}
CONTAINER=$(docker ps --quiet --latest --filter ancestor=${STAGE1})
docker export ${CONTAINER} | docker import - ${REPOSITORY}:stage2
}
stage3() {
{
echo "FROM ${REPOSITORY}:stage2"
grep -E '^(ENTRYPOINT|CMD)' Dockerfile
} | docker build -t ${REPOSITORY}:stage3 -
}
tag() {
docker tag ${REPOSITORY}:stage3 ${REPOSITORY}:latest
}
stage1 && stage2 && stage3 && tag
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment