40 lines
1.4 KiB
Bash
40 lines
1.4 KiB
Bash
|
#!/bin/bash
|
||
|
set -e
|
||
|
|
||
|
# wrapper around "docker build" that creates a temporary directory and copies files into it first so that arbitrary host directories can be copied into containers without bind mounts, but accepts a Dockerfile on stdin
|
||
|
|
||
|
# usage: ./docker-build.sh some-host-directory some-new-image:some-tag <<EOD
|
||
|
# FROM ...
|
||
|
# COPY dir/... /.../
|
||
|
# EOD
|
||
|
# ie: ./docker-build.sh .../hylang-hello-world librarytest/hylang <<EOD
|
||
|
# FROM hylang
|
||
|
# COPY dir/container.hy /dir/
|
||
|
# CMD ["hy", "/dir/container.hy"]
|
||
|
# EOD
|
||
|
|
||
|
dir="$1"; shift
|
||
|
[ -d "$dir" ]
|
||
|
|
||
|
imageTag="$1"; shift
|
||
|
|
||
|
tmp="$(mktemp -t -d docker-library-test-build-XXXXXXXXXX)"
|
||
|
trap "rm -rf '$tmp'" EXIT
|
||
|
|
||
|
cat > "$tmp/Dockerfile"
|
||
|
|
||
|
from="$(awk -F '[ \t]+' 'toupper($1) == "FROM" { print $2; exit }' "$tmp/Dockerfile")"
|
||
|
onbuilds="$(docker inspect -f '{{len .Config.OnBuild}}' "$from")"
|
||
|
if [ "$onbuilds" -gt 0 ]; then
|
||
|
# crap, the image we want to build has some ONBUILD instructions
|
||
|
# those are kind of going to ruin our day
|
||
|
# let's do some hacks to strip those bad boys out in a new fake layer
|
||
|
"$(dirname "$(readlink -f "$BASH_SOURCE")")/remove-onbuild.sh" "$from" "$imageTag"
|
||
|
awk -F '[ \t]+' 'toupper($1) == "FROM" { $2 = "'"$imageTag"'" } { print }' "$tmp/Dockerfile" > "$tmp/Dockerfile.new"
|
||
|
mv "$tmp/Dockerfile.new" "$tmp/Dockerfile"
|
||
|
fi
|
||
|
|
||
|
cp -RL "$dir" "$tmp/dir"
|
||
|
|
||
|
docker build -t "$imageTag" "$tmp" > /dev/null
|