github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/contrib/mkimage.sh (about)

     1  #!/usr/bin/env bash
     2  set -e
     3  
     4  mkimg="$(basename "$0")"
     5  
     6  usage() {
     7  	echo >&2 "usage: $mkimg [-d dir] [-t tag] [--compression algo| --no-compression] script [script-args]"
     8  	echo >&2 "   ie: $mkimg -t someuser/debian debootstrap --variant=minbase jessie"
     9  	echo >&2 "       $mkimg -t someuser/ubuntu debootstrap --include=ubuntu-minimal --components=main,universe trusty"
    10  	echo >&2 "       $mkimg -t someuser/busybox busybox-static"
    11  	echo >&2 "       $mkimg -t someuser/centos:5 rinse --distribution centos-5"
    12  	echo >&2 "       $mkimg -t someuser/mageia:4 mageia-urpmi --version=4"
    13  	echo >&2 "       $mkimg -t someuser/mageia:4 mageia-urpmi --version=4 --mirror=http://somemirror/"
    14  	exit 1
    15  }
    16  
    17  scriptDir="$(dirname "$(readlink -f "$BASH_SOURCE")")/mkimage"
    18  
    19  os=
    20  os=$(uname -o)
    21  
    22  optTemp=$(getopt --options '+d:t:c:hC' --longoptions 'dir:,tag:,compression:,no-compression,help' --name "$mkimg" -- "$@")
    23  eval set -- "$optTemp"
    24  unset optTemp
    25  
    26  dir=
    27  tag=
    28  compression="auto"
    29  while true; do
    30  	case "$1" in
    31  		-d | --dir)
    32  			dir="$2"
    33  			shift 2
    34  			;;
    35  		-t | --tag)
    36  			tag="$2"
    37  			shift 2
    38  			;;
    39  		--compression)
    40  			compression="$2"
    41  			shift 2
    42  			;;
    43  		--no-compression)
    44  			compression="none"
    45  			shift 1
    46  			;;
    47  		-h | --help) usage ;;
    48  		--)
    49  			shift
    50  			break
    51  			;;
    52  	esac
    53  done
    54  
    55  script="$1"
    56  [ "$script" ] || usage
    57  shift
    58  
    59  if [ "$compression" == 'auto' ] || [ -z "$compression" ]; then
    60  	compression='xz'
    61  fi
    62  
    63  [ "$compression" == 'none' ] && compression=''
    64  
    65  if [ ! -x "$scriptDir/$script" ]; then
    66  	echo >&2 "error: $script does not exist or is not executable"
    67  	echo >&2 "  see $scriptDir for possible scripts"
    68  	exit 1
    69  fi
    70  
    71  # don't mistake common scripts like .febootstrap-minimize as image-creators
    72  if [[ "$script" == .* ]]; then
    73  	echo >&2 "error: $script is a script helper, not a script"
    74  	echo >&2 "  see $scriptDir for possible scripts"
    75  	exit 1
    76  fi
    77  
    78  delDir=
    79  if [ -z "$dir" ]; then
    80  	dir="$(mktemp -d ${TMPDIR:-/var/tmp}/docker-mkimage.XXXXXXXXXX)"
    81  	delDir=1
    82  fi
    83  
    84  rootfsDir="$dir/rootfs"
    85  (
    86  	set -x
    87  	mkdir -p "$rootfsDir"
    88  )
    89  
    90  # pass all remaining arguments to $script
    91  "$scriptDir/$script" "$rootfsDir" "$@"
    92  
    93  # Docker mounts tmpfs at /dev and procfs at /proc so we can remove them
    94  rm -rf "$rootfsDir/dev" "$rootfsDir/proc"
    95  mkdir -p "$rootfsDir/dev" "$rootfsDir/proc"
    96  
    97  # make sure /etc/resolv.conf has something useful in it
    98  mkdir -p "$rootfsDir/etc"
    99  cat > "$rootfsDir/etc/resolv.conf" << 'EOF'
   100  nameserver 8.8.8.8
   101  nameserver 8.8.4.4
   102  EOF
   103  
   104  tarFile="$dir/rootfs.tar${compression:+.$compression}"
   105  touch "$tarFile"
   106  
   107  (
   108  	set -x
   109  	tar --numeric-owner --create --auto-compress --file "$tarFile" --directory "$rootfsDir" --transform='s,^./,,' .
   110  )
   111  
   112  echo >&2 "+ cat > '$dir/Dockerfile'"
   113  cat > "$dir/Dockerfile" << EOF
   114  FROM scratch
   115  ADD $(basename "$tarFile") /
   116  EOF
   117  
   118  # if our generated image has a decent shell, let's set a default command
   119  for shell in /bin/bash /usr/bin/fish /usr/bin/zsh /bin/sh; do
   120  	if [ -x "$rootfsDir/$shell" ]; then
   121  		(
   122  			set -x
   123  			echo 'CMD ["'"$shell"'"]' >> "$dir/Dockerfile"
   124  		)
   125  		break
   126  	fi
   127  done
   128  
   129  (
   130  	set -x
   131  	rm -rf "$rootfsDir"
   132  )
   133  
   134  if [ "$tag" ]; then
   135  	(
   136  		set -x
   137  		docker build -t "$tag" "$dir"
   138  	)
   139  elif [ "$delDir" ]; then
   140  	# if we didn't specify a tag and we're going to delete our dir, let's just build an untagged image so that we did _something_
   141  	(
   142  		set -x
   143  		docker build "$dir"
   144  	)
   145  fi
   146  
   147  if [ "$delDir" ]; then
   148  	(
   149  		set -x
   150  		rm -rf "$dir"
   151  	)
   152  fi