mirror of
				https://github.com/bensuperpc/dockcross.git
				synced 2025-11-04 01:46:24 +01:00 
			
		
		
		
	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.
 | 
						|
#
 | 
						|
################################################################################
 |