blob: f8e256dab4db3e7d97fc964496bc5ef8448514f1 [file] [log] [blame]
#!/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 <docker-name> <name-of-directory>
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 <name-of-directory>/chroot /bin/sh -l
"
}
#
# PLEASE DON'T TOUCH ME
#
# readme file for run_chroot.sh
readme()
{
md_codequote='```'
cat > "$CHROOT_METADIR"/README.md <<EOF
# RUN CHROOT COMMAND
# usage:
${md_codequote}
run_chroot.sh help
${md_codequote}
**Don't modify insides of this directory (where this README.md lies).**
The structure is needed as it is.
If you wish to just run chroot by yourself, you can do:
${md_codequote}
chroot ./chroot /bin/sh -l
${md_codequote}
# requirements:
* root privileges
* docker service
# directory structure:
${md_codequote}
README.md
chroot/
.overlay
.workdir
.merged
${md_codequote}
EOF
}
# arg: <docker-name>
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