129 lines
3.4 KiB
Bash
Executable File
129 lines
3.4 KiB
Bash
Executable File
#! /bin/sh
|
|
|
|
# The main goal of this script is test and time builds using Buildah or Docker.
|
|
# We hope to use it to help optimize Buildah build performance
|
|
#
|
|
# It takes two options
|
|
# First option tells the type of the container image
|
|
# build to do. Valid options are:
|
|
# Docker - docker build
|
|
# Buildah - buildah bud
|
|
# Both - Do docker build followed by buildah bud
|
|
#
|
|
# Second Option specifies a directory or cleanup
|
|
# The script will 'find' files beginning with Dockerfile, for each Dockerfile
|
|
# it finds it will run a build with the Dockerfile and directory for the
|
|
# context. When it does the builds, it will call time on them to show how
|
|
# long the builds take. The created image name will be a combination of the
|
|
# lowercased Directory name that the Dockerfile was found in plus the lower
|
|
# cased dockerfile name.
|
|
#
|
|
# if the second field is cleanup, the script will remove all images from the
|
|
# specified builder.
|
|
#
|
|
# The script does not check for conflicts on naming.
|
|
#
|
|
# Outputs file:
|
|
#
|
|
#
|
|
# cat /tmp/build_speed.json
|
|
# {
|
|
# "/usr/share/fedora-dockerfiles/redis/Dockerfile": {
|
|
# "docker": {
|
|
# "command": "docker build -f /usr/share/fedora-dockerfiles/redis/Dockerfile -t redis_dockerfile /usr/share/fedora-dockerfiles/redis",
|
|
# "real": "3:28.70"
|
|
# },
|
|
# "buildah": {
|
|
# "command": "buildah bud --layers -f /usr/share/fedora-dockerfiles/redis/Dockerfile -t redis_dockerfile /usr/share/fedora-dockerfiles/redis",
|
|
# "real": "2:55.48"
|
|
# }
|
|
# }
|
|
# }
|
|
#
|
|
# Examples uses
|
|
# ./build_speed.sh Docker ~/MyImages
|
|
# ./build_speed.sh Both /usr/share/fedora-dockerfiles/django/Dockerfile
|
|
|
|
#totalsfile=$(mktemp /tmp/buildspeedXXX.json)
|
|
totalsfile=/tmp/build_speed.json
|
|
commaDockerfile=""
|
|
|
|
echo -n '{' > $totalsfile
|
|
Dockerfiles() {
|
|
find -L $1 -name Dockerfile\*
|
|
}
|
|
|
|
Buildah() {
|
|
Name=$1
|
|
Dockerfile=$2
|
|
Context=$3
|
|
echo buildah bud --layers -f ${Dockerfile} -t ${Name} ${Context}
|
|
Time buildah bud --layers -f ${Dockerfile} -t ${Name} ${Context}
|
|
}
|
|
|
|
Time() {
|
|
outfile=$(mktemp /tmp/buildspeedXXX)
|
|
/usr/bin/time -o $outfile --f "%E" $@
|
|
echo "{\"engine\": \"$1\", \"command\": \"$@\", \"real\": \"$(cat ${outfile})\"}"
|
|
echo -n "${comma}\"$1\": {\"command\": \"$@\", \"real\": \"$(cat ${outfile})\"}" >> $totalsfile
|
|
comma=","
|
|
rm -f $outfile
|
|
}
|
|
|
|
Docker() {
|
|
Name=$1
|
|
Dockerfile=$2
|
|
Context=$3
|
|
echo docker build -f ${Dockerfile} -t ${Name} ${Context}
|
|
Time docker build -f ${Dockerfile} -t ${Name} ${Context}
|
|
}
|
|
|
|
Both() {
|
|
comma=""
|
|
echo -n "${commaDockerfile}\"$2\": {" >> $totalsfile
|
|
commaDockerfile=","
|
|
Docker $1 $2 $3
|
|
Buildah $1 $2 $3
|
|
echo -n "}" >> $totalsfile
|
|
}
|
|
|
|
Docker_cleanup() {
|
|
docker rmi --force $(docker images -q)
|
|
}
|
|
|
|
Buildah_cleanup() {
|
|
buildah rmi --force --all
|
|
}
|
|
|
|
Both_cleanup() {
|
|
Docker_cleanup
|
|
Buildah_cleanup
|
|
}
|
|
|
|
Cmd=${1?Missing CMD argument}
|
|
Path=${2?Missing PATH argument}
|
|
|
|
case "$Cmd" in
|
|
Docker) ;;
|
|
Buildah) ;;
|
|
Both) ;;
|
|
*) echo "Invalid command '$Cmd'; must be Buildah, Docker, or Both"; exit 1;;
|
|
esac
|
|
|
|
|
|
if [ "$Path" == "cleanup" ]; then
|
|
${Cmd}_cleanup
|
|
exit 0
|
|
fi
|
|
|
|
for i in $(Dockerfiles ${Path});do
|
|
name=$(basename $(dirname $i) | sed -e 's/\(.*\)/\L\1/')
|
|
name=${name}_$(basename $i | sed -e 's/\(.*\)/\L\1/')
|
|
echo ${Cmd} ${name} $i $(dirname $i)
|
|
${Cmd} ${name} $i $(dirname $i)
|
|
done
|
|
|
|
echo '}'>>$totalsfile
|
|
echo cat $totalsfile
|
|
cat $totalsfile
|