mirror of
				https://github.com/bensuperpc/dockcross.git
				synced 2025-10-30 07:36:24 +01:00 
			
		
		
		
	 8c955feeef
			
		
	
	8c955feeef
	
	
	
		
			
			If `id -un` or `id -gn` outputs a name containing a space, e.g. when joined to an AD domain with SSSD, the current `dockcross` script would break and abort with an error: `docker: invalid reference format.`, because it would interpret the part after the space as an image name.
		
			
				
	
	
		
			255 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| 
 | |
| DEFAULT_DOCKCROSS_IMAGE=dockcross/base  # DO NOT MOVE THIS LINE (see entrypoint.sh)
 | |
| 
 | |
| #------------------------------------------------------------------------------
 | |
| # Helpers
 | |
| #
 | |
| err() {
 | |
|     echo -e >&2 ERROR: $@\\n
 | |
| }
 | |
| 
 | |
| die() {
 | |
|     err $@
 | |
|     exit 1
 | |
| }
 | |
| 
 | |
| has() {
 | |
|     # eg. has command update
 | |
|     local kind=$1
 | |
|     local name=$2
 | |
| 
 | |
|     type -t $kind:$name | grep -q function
 | |
| }
 | |
| 
 | |
| #------------------------------------------------------------------------------
 | |
| # Command handlers
 | |
| #
 | |
| command:update-image() {
 | |
|     docker pull $FINAL_IMAGE
 | |
| }
 | |
| 
 | |
| help:update-image() {
 | |
|     echo Pull the latest $FINAL_IMAGE .
 | |
| }
 | |
| 
 | |
| command:update-script() {
 | |
|     if cmp -s <( docker run --rm $FINAL_IMAGE ) $0; then
 | |
|         echo $0 is up to date
 | |
|     else
 | |
|         echo -n Updating $0 '... '
 | |
|         docker run --rm $FINAL_IMAGE > $0 && echo ok
 | |
|     fi
 | |
| }
 | |
| 
 | |
| help:update-image() {
 | |
|     echo Update $0 from $FINAL_IMAGE .
 | |
| }
 | |
| 
 | |
| command:update() {
 | |
|     command:update-image
 | |
|     command:update-script
 | |
| }
 | |
| 
 | |
| help:update() {
 | |
|     echo Pull the latest $FINAL_IMAGE, and then update $0 from that.
 | |
| }
 | |
| 
 | |
| command:help() {
 | |
|     if [[ $# != 0 ]]; then
 | |
|         if ! has command $1; then
 | |
|             err \"$1\" is not an dockcross command
 | |
|             command:help
 | |
|         elif ! has help $1; then
 | |
|             err No help found for \"$1\"
 | |
|         else
 | |
|             help:$1
 | |
|         fi
 | |
|     else
 | |
|         cat >&2 <<ENDHELP
 | |
| Usage: dockcross [options] [--] command [args]
 | |
| 
 | |
| By default, run the given *command* in an dockcross Docker container.
 | |
| 
 | |
| The *options* can be one of:
 | |
| 
 | |
|     --args|-a           Extra args to the *docker run* command
 | |
|     --image|-i          Docker cross-compiler image to use
 | |
|     --config|-c         Bash script to source before running this script
 | |
| 
 | |
| 
 | |
| Additionally, there are special update commands:
 | |
| 
 | |
|     update-image
 | |
|     update-script
 | |
|     update
 | |
| 
 | |
| For update command help use: $0 help <command>
 | |
| ENDHELP
 | |
|         exit 1
 | |
|     fi
 | |
| }
 | |
| 
 | |
| #------------------------------------------------------------------------------
 | |
| # Option processing
 | |
| #
 | |
| special_update_command=''
 | |
| while [[ $# != 0 ]]; do
 | |
|     case $1 in
 | |
| 
 | |
|         --)
 | |
|             shift
 | |
|             break
 | |
|             ;;
 | |
| 
 | |
|         --args|-a)
 | |
|             ARG_ARGS="$2"
 | |
|             shift 2
 | |
|             ;;
 | |
| 
 | |
|         --config|-c)
 | |
|             ARG_CONFIG="$2"
 | |
|             shift 2
 | |
|             ;;
 | |
| 
 | |
|         --image|-i)
 | |
|             ARG_IMAGE="$2"
 | |
|             shift 2
 | |
|             ;;
 | |
|         update|update-image|update-script)
 | |
|             special_update_command=$1
 | |
|             break
 | |
|             ;;
 | |
|         -*)
 | |
|             err Unknown option \"$1\"
 | |
|             command:help
 | |
|             exit
 | |
|             ;;
 | |
| 
 | |
|         *)
 | |
|             break
 | |
|             ;;
 | |
| 
 | |
|     esac
 | |
| done
 | |
| 
 | |
| # The precedence for options is:
 | |
| # 1. command-line arguments
 | |
| # 2. environment variables
 | |
| # 3. defaults
 | |
| 
 | |
| # Source the config file if it exists
 | |
| DEFAULT_DOCKCROSS_CONFIG=~/.dockcross
 | |
| FINAL_CONFIG=${ARG_CONFIG-${DOCKCROSS_CONFIG-$DEFAULT_DOCKCROSS_CONFIG}}
 | |
| 
 | |
| [[ -f "$FINAL_CONFIG" ]] && source "$FINAL_CONFIG"
 | |
| 
 | |
| # Set the docker image
 | |
| FINAL_IMAGE=${ARG_IMAGE-${DOCKCROSS_IMAGE-$DEFAULT_DOCKCROSS_IMAGE}}
 | |
| 
 | |
| # Handle special update command
 | |
| if [ "$special_update_command" != "" ]; then
 | |
|     case $special_update_command in
 | |
| 
 | |
|         update)
 | |
|             command:update
 | |
|             exit $?
 | |
|             ;;
 | |
| 
 | |
|         update-image)
 | |
|             command:update-image
 | |
|             exit $?
 | |
|             ;;
 | |
| 
 | |
|         update-script)
 | |
|             command:update-script
 | |
|             exit $?
 | |
|             ;;
 | |
| 
 | |
|     esac
 | |
| fi
 | |
| 
 | |
| # Set the docker run extra args (if any)
 | |
| FINAL_ARGS=${ARG_ARGS-${DOCKCROSS_ARGS}}
 | |
| 
 | |
| # Bash on Ubuntu on Windows
 | |
| UBUNTU_ON_WINDOWS=$([ -e /proc/version ] && grep -l Microsoft /proc/version || echo "")
 | |
| # MSYS, Git Bash, etc.
 | |
| MSYS=$([ -e /proc/version ] && grep -l MINGW /proc/version || echo "")
 | |
| 
 | |
| if [ -z "$UBUNTU_ON_WINDOWS" -a -z "$MSYS" ]; then
 | |
|     USER_IDS=(-e BUILDER_UID="$( id -u )" -e BUILDER_GID="$( id -g )" -e BUILDER_USER="$( id -un )" -e BUILDER_GROUP="$( id -gn )")
 | |
| fi
 | |
| 
 | |
| # Change the PWD when working in Docker on Windows
 | |
| if [ -n "$UBUNTU_ON_WINDOWS" ]; then
 | |
|     WSL_ROOT="/mnt/"
 | |
|     CFG_FILE=/etc/wsl.conf
 | |
| 	if [ -f "$CFG_FILE" ]; then
 | |
| 		CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g')
 | |
| 		eval "$CFG_CONTENT"
 | |
| 		if [ -n "$root" ]; then
 | |
| 			WSL_ROOT=$root
 | |
| 		fi
 | |
| 	fi
 | |
|     HOST_PWD=`pwd -P`
 | |
|     HOST_PWD=${HOST_PWD/$WSL_ROOT//}
 | |
| elif [ -n "$MSYS" ]; then
 | |
|     HOST_PWD=$PWD
 | |
|     HOST_PWD=${HOST_PWD/\//}
 | |
|     HOST_PWD=${HOST_PWD/\//:\/}
 | |
| else
 | |
|     HOST_PWD=$PWD
 | |
| fi
 | |
| 
 | |
| # Mount Additional Volumes
 | |
| if [ -z "$SSH_DIR" ]; then
 | |
|     SSH_DIR="$HOME/.ssh"
 | |
| fi
 | |
| 
 | |
| HOST_VOLUMES=
 | |
| if [ -e "$SSH_DIR" ]; then
 | |
|     HOST_VOLUMES+="-v $SSH_DIR:/home/$(id -un)/.ssh"
 | |
| fi
 | |
| 
 | |
| #------------------------------------------------------------------------------
 | |
| # Now, finally, run the command in a container
 | |
| #
 | |
| tty -s && TTY_ARGS=-ti || TTY_ARGS=
 | |
| CONTAINER_NAME=dockcross_$RANDOM
 | |
| docker run $TTY_ARGS --name $CONTAINER_NAME \
 | |
|     -v "$HOST_PWD":/work \
 | |
|     $HOST_VOLUMES \
 | |
|     "${USER_IDS[@]}" \
 | |
|     $FINAL_ARGS \
 | |
|     $FINAL_IMAGE "$@"
 | |
| run_exit_code=$?
 | |
| 
 | |
| # Attempt to delete container
 | |
| rm_output=$(docker rm -f $CONTAINER_NAME 2>&1)
 | |
| rm_exit_code=$?
 | |
| if [[ $rm_exit_code != 0 ]]; then
 | |
|   if [[ "$CIRCLECI" == "true" ]] && [[ $rm_output == *"Driver btrfs failed to remove"* ]]; then
 | |
|     : # Ignore error because of https://circleci.com/docs/docker-btrfs-error/
 | |
|   else
 | |
|     echo "$rm_output"
 | |
|     exit $rm_exit_code
 | |
|   fi
 | |
| fi
 | |
| 
 | |
| exit $run_exit_code
 | |
| 
 | |
| ################################################################################
 | |
| #
 | |
| # This image is not intended to be run manually.
 | |
| #
 | |
| # To create a dockcross helper script for the
 | |
| # dockcross/linux-armv7 image, run:
 | |
| #
 | |
| # docker run --rm dockcross/linux-armv7 > dockcross-linux-armv7
 | |
| # chmod +x dockcross-linux-armv7
 | |
| #
 | |
| # You may then wish to move the dockcross script to your PATH.
 | |
| #
 | |
| ################################################################################
 |