dockerbuild.sh 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. #
  4. # variables
  5. #
  6. RESET="\033[0m"
  7. RED="\033[0;31m"
  8. YELLOW="\033[0;33m"
  9. MAGENTA="\033[0;95m"
  10. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
  11. build_args=()
  12. docker_args=()
  13. #
  14. # Functions
  15. #
  16. __usage() {
  17. echo "Usage: $(basename "${BASH_SOURCE[0]}") <image> [options] [[--] <Arguments>...]"
  18. echo ""
  19. echo "Arguments:"
  20. echo " image The docker image to use."
  21. echo " <Arguments>... Arguments passed to the command. Variable number of arguments allowed."
  22. echo ""
  23. echo "Options:"
  24. echo " -v, --volume <VOLUME> An additional volume mount to add to the build container"
  25. echo ""
  26. echo "Description:"
  27. echo " This will run build.sh inside the dockerfile as defined in build/docker/\$image.Dockerfile."
  28. if [[ "${1:-}" != '--no-exit' ]]; then
  29. exit 2
  30. fi
  31. }
  32. __error() {
  33. echo -e "${RED}error: $*${RESET}" 1>&2
  34. }
  35. __warn() {
  36. echo -e "${YELLOW}warning: $*${RESET}"
  37. }
  38. __machine_has() {
  39. hash "$1" > /dev/null 2>&1
  40. return $?
  41. }
  42. #
  43. # main
  44. #
  45. image="${1:-}"
  46. shift || True
  47. while [[ $# -gt 0 ]]; do
  48. case $1 in
  49. -\?|-h|--help)
  50. __usage --no-exit
  51. exit 0
  52. ;;
  53. -v|--volume)
  54. shift
  55. volume_spec="${1:-}"
  56. [ -z "$volume_spec" ] && __error "Missing value for parameter --volume" && __usage
  57. docker_args[${#docker_args[*]}]="--volume"
  58. docker_args[${#docker_args[*]}]="$volume_spec"
  59. ;;
  60. *)
  61. build_args[${#build_args[*]}]="$1"
  62. ;;
  63. esac
  64. shift
  65. done
  66. if [ -z "$image" ]; then
  67. __usage --no-exit
  68. __error 'Missing required argument: image'
  69. exit 1
  70. fi
  71. if ! __machine_has docker; then
  72. __error 'Missing required command: docker'
  73. exit 1
  74. fi
  75. dockerfile="$DIR/build/docker/$image.Dockerfile"
  76. tagname="universe-build-$image"
  77. docker build "$(dirname "$dockerfile")" \
  78. --build-arg "USER=$(whoami)" \
  79. --build-arg "USER_ID=$(id -u)" \
  80. --build-arg "GROUP_ID=$(id -g)" \
  81. --tag $tagname \
  82. -f "$dockerfile"
  83. docker run \
  84. --rm \
  85. -t \
  86. -e CI \
  87. -e TEAMCITY_VERSION \
  88. -e DOTNET_CLI_TELEMETRY_OPTOUT \
  89. -e Configuration \
  90. -v "$DIR:/code/build" \
  91. ${docker_args[@]+"${docker_args[@]}"} \
  92. $tagname \
  93. ./build.sh \
  94. ${build_args[@]+"${build_args[@]}"} \
  95. "-p:HostMachineRepositoryRoot=$DIR"