docker-build.sh 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/bin/bash
  2. set -e
  3. # 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
  4. # usage: ./docker-build.sh some-host-directory some-new-image:some-tag <<EOD
  5. # FROM ...
  6. # COPY dir/... /.../
  7. # EOD
  8. # ie: ./docker-build.sh .../hylang-hello-world librarytest/hylang <<EOD
  9. # FROM hylang
  10. # COPY dir/container.hy /dir/
  11. # CMD ["hy", "/dir/container.hy"]
  12. # EOD
  13. dir="$1"; shift
  14. [ -d "$dir" ]
  15. imageTag="$1"; shift
  16. tmp="$(mktemp -t -d docker-library-test-build-XXXXXXXXXX)"
  17. trap "rm -rf '$tmp'" EXIT
  18. cat > "$tmp/Dockerfile"
  19. from="$(awk -F '[ \t]+' 'toupper($1) == "FROM" { print $2; exit }' "$tmp/Dockerfile")"
  20. if ! docker inspect "$from" &> /dev/null; then
  21. docker pull "$from" > /dev/null
  22. fi
  23. onbuilds="$(docker inspect -f '{{len .Config.OnBuild}}' "$from")"
  24. if [ "$onbuilds" -gt 0 ]; then
  25. # crap, the image we want to build has some ONBUILD instructions
  26. # those are kind of going to ruin our day
  27. # let's do some hacks to strip those bad boys out in a new fake layer
  28. "$(dirname "$(readlink -f "$BASH_SOURCE")")/remove-onbuild.sh" "$from" "$imageTag"
  29. awk -F '[ \t]+' 'toupper($1) == "FROM" { $2 = "'"$imageTag"'" } { print }' "$tmp/Dockerfile" > "$tmp/Dockerfile.new"
  30. mv "$tmp/Dockerfile.new" "$tmp/Dockerfile"
  31. fi
  32. cp -RL "$dir" "$tmp/dir"
  33. docker build -t "$imageTag" "$tmp" > /dev/null