#!/bin/sh # COPYRIGHT NOTICE STARTS HERE # Copyright 2018 © Samsung Electronics Co., Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # COPYRIGHT NOTICE ENDS HERE set -e CMD=$(basename "$0") help() { echo " NAME: ${CMD} - create a chroot directory from docker image DESCRIPTION: It will export docker image into a directory capable of chrooting. It needs and will run these commands (requires docker service): docker create docker export USAGE: ${CMD} [-h|--help|help] This help ${CMD} convert It will convert docker image into directory - no chroot yet. The name of the docker image must be imported already (not a file): docker image ls The directory will be created and so this command will fail if some directory or a file of this name (filepath) already exists! There is another script run_chroot.sh with which you can do chroot on this newly created directory - so it is expected that this directory is kept clean and as it is. If you don't care about this feature (run_chroot.sh) and you know what are you doing, then do necessary mounts and execute: chroot /chroot /bin/sh -l " } # # PLEASE DON'T TOUCH ME # # readme file for run_chroot.sh readme() { md_codequote='```' cat > "$CHROOT_METADIR"/README.md < check_docker_image() { image="$1" match=$(docker image ls --no-trunc -q "$image" | wc -l) case $match in 0) echo ERROR: "Docker image does not exist: ${DOCKER_IMAGE}" >&2 exit 1 ;; 1) : ;; *) echo ERROR: "Multiple results for this docker name: ${DOCKER_IMAGE}" >&2 exit 1 ;; esac return 0 } cleanup() { if [ -n "$DOCKER_CONTAINER" ] ; then echo INFO: "Delete the export container: ${DOCKER_CONTAINER}" >&2 if ! docker rm "$DOCKER_CONTAINER" > /dev/null ; then echo ERROR: "Failed to delete: ${DOCKER_CONTAINER}" >&2 fi fi } on_exit() { set +e cleanup } action=nil case "$1" in ''|-h|--help|help) help exit 0 ;; convert) action=convert DOCKER_IMAGE="$2" CHROOT_METADIR="$3" ;; *) echo ERROR: "Bad usage" >&2 help >&2 exit 1 ;; esac case "$action" in ''|nil) echo ERROR: "Nothing to do - missing command" >&2 help >&2 exit 1 ;; convert) if [ -z "$DOCKER_IMAGE" ] || [ -z "$CHROOT_METADIR" ] ; then echo ERROR: "Missing argument" >&2 help >&2 exit 1 fi if [ -e "$CHROOT_METADIR" ] ; then echo ERROR: "Filepath already exists: ${CHROOT_METADIR}" >&2 echo ERROR: "Please rename it, remove it or use different name" >&2 echo ERROR: "I need my working directory empty, thanks" >&2 exit 1 fi # check if docker image is there check_docker_image "$DOCKER_IMAGE" # we must be root if [ "$(id -u)" -ne 0 ] ; then echo ERROR: "I need root privileges and you are not root: $(id -nu)" >&2 exit 1 fi # making sure that CHROOT_METADIR is absolute path CHROOT_METADIR=$(readlink -f "$CHROOT_METADIR") # set trap trap on_exit INT QUIT TERM EXIT # making readme mkdir -p "$CHROOT_METADIR"/ readme # create container DOCKER_CONTAINER=$(docker create "$DOCKER_IMAGE") if [ -z "$DOCKER_CONTAINER" ] ; then echo ERROR: "I could not create a container from: ${DOCKER_IMAGE}" >&2 exit 1 fi # unpacking of image mkdir -p "$CHROOT_METADIR"/chroot echo INFO: "Export started - it can take a while to finish..." >&2 if ! docker export "$DOCKER_CONTAINER" | tar -C "$CHROOT_METADIR"/chroot -xf - ; then echo ERROR: "Unpacking failed - permissions?" >&2 exit 1 else echo INFO: "Export success: $CHROOT_METADIR/chroot" >&2 echo INFO: "Checkout the README file: $CHROOT_METADIR/README.md" >&2 fi ;; esac exit 0