new: add core RUN step

refactored: Dockefile template
refactor: example and move src/ there a simple example
new: distros.csv holds table of valid distros, their images and install/update commands
refactor: various fixes and adjustment in response to above
refactor: help vastly improved and updated
master
David Kebler 2023-04-22 08:19:45 -07:00
parent efe8d0fa2d
commit ca857a032a
80 changed files with 697 additions and 671 deletions

View File

@ -2,25 +2,24 @@
ARG BASE_IMAGE ARG BASE_IMAGE
FROM $BASE_IMAGE FROM $BASE_IMAGE
ARG BASE_IMAGE ARG BASE_IMAGE
ARG SYSADMIN_PW
ARG VERBOSE ARG VERBOSE
ARG REBUILD
ARG LINUX_DISTRO=alpine ARG LINUX_DISTRO=alpine
WORKDIR /build WORKDIR /build
# PACKAGES # CORE
RUN --mount=type=bind,source=.src/packages,target=/build/packages \ RUN --mount=type=bind,source=./core,target=/build \
<<eot <<eot
.INCLUDE packages.tpl .INCLUDE core.tpl
eot
# END PACKAGES
# INITIALIZATION
RUN --mount=type=bind,source=.src/init,target=/build/init \
<<eot
.INCLUDE init.tpl
eot eot
# END INITIALIZATION % if [[ ( "$_packages_" && ! $BUILD_SRC = "_core_" ) ]]; then
.INCLUDE packages.run
% fi
% if [[ ( "$BUILD_SRC" && ! $BUILD_SRC = "_core_" ) ]]; then
.INCLUDE init.run
% fi
# default command # default command
ENTRYPOINT ["/opt/bin/entrypoint"] ENTRYPOINT ["/opt/bin/entrypoint"]

31
Dockerfile.d/core.tpl Normal file
View File

@ -0,0 +1,31 @@
#!/bin/sh
%
if [ "$REBUILD" = "core" ]; then
echo "## Busting Cache, Forcing Rebuild starting at core RUN "
echo $(date)
fi
%
if ! { [ "$VERBOSE" = "core" ] || [ "$VERBOSE" = "all" ]; }; then unset VERBOSE; fi
mkdir -p /opt
/bin/cp -R -f -p opt/. /opt
. /opt/lib/verbose.lib
echo "**************************************"
echo "****** Building UCI Image Core ******"
quiet echo core build directory
quiet pwd
quiet ls -la
quiet echo "--------------------------------------"
. /opt/lib/distro.lib
if validate_distro; then
echo distro $LINUX_DISTRO was validated...continuing
set_distro
/bin/sh ./packages.sh
/bin/bash -l ./core.sh
echo
echo "************* End UCI CORE build ********************"
else
echo !!! FATAL ERROR: distro of base image $BASE_IMAGE does not match linux distro $LINUX_DISTRO !!!
exit 1
fi

View File

@ -1,5 +1,6 @@
# echo build source?: $BUILD_SRC packages? $packages
pushd $(dirname "$(realpath "$BASH_SOURCE")") > /dev/null || return 1 pushd $(dirname "$(realpath "$BASH_SOURCE")") > /dev/null || return 1
source <(../lib/bash-tpl Dockerfile.tpl ) | grep -v '^# ' > ../Dockerfile source <(../lib/bash-tpl Dockerfile.tpl ) | grep -v '^# ' > ../Dockerfile
echo " ************* uci build Dockerfile created *****************" echo "------------ Created Dockfile from template in Dockerfile.d -------------"
popd > /dev/null || return 2 popd > /dev/null || return 2

5
Dockerfile.d/init.run Normal file
View File

@ -0,0 +1,5 @@
# INITIALIZATION
RUN --mount=type=bind,source=.src/init,target=/build \
<<eot
.INCLUDE init.tpl
eot

View File

@ -4,60 +4,25 @@
echo "## Busting Cache, Forcing Rebuild $(date)" echo "## Busting Cache, Forcing Rebuild $(date)"
fi fi
% %
quiet () { echo "************* BUILD INITIALZATION ***********************"
if [[ $VERBOSE ]]; then $@; fi if ! { [ "$VERBOSE" = "init" ] || [ "$VERBOSE" = "all" ]; }; then unset VERBOSE; fi
}
quiet echo -e "\n ************************************************* \n"
quiet echo "****** Initializing Image with build source ******"
cd init
pwd; quiet ls -la
export BUILDING=true export BUILDING=true
export BUILD_DIR=$PWD export BUILD_DIR=/build
export SHELL=/bin/bash echo Distro is $LINUX_DISTRO
export BIN_DIR=/opt/bin source /opt/lib/verbose.lib
mkdir -p $BIN_DIR
echo "export BIN_DIR=${BIN_DIR}" >> /tmp/profile
echo 'export PATH=$BIN_DIR:$PATH' >> /tmp/profile
echo " ##### creating entrypoint script ###" echo sourcing core-run.env
cat << EOE >$BIN_DIR/entrypoint quiet cat /opt/core_run.env
.INCLUDE ./init/entrypoint.tpl source /opt/core_run.env
EOE
chmod +x $BIN_DIR/entrypoint
quiet echo '------ default entrypoint -----'
quiet ls -la $BIN_DIR/entrypoint
quiet cat $BIN_DIR/entrypoint
quiet echo "------------"
echo " ##### creating default start script ###" echo copying source init/opt directory to image /opt directory
cat << "EOS" >$BIN_DIR/start quiet ls -la opt/
.INCLUDE ./init/start.sh /bin/cp -R -f -p opt/. /opt
EOS
chmod -R +x $BIN_DIR/start
quiet echo "--- DEFAULT START SCRIPT in $BIN_DIR/start ---"
quiet cat $BIN_DIR/start
quiet echo "-----------------------------------"
echo " ##### creating map host id script ###" [[ -f ./build.env ]] && source ./build.env && echo loaded build.env at /init/build.env in source
cat << "EOM" >$BIN_DIR/map-host-id
.INCLUDE ./init/map-host-id.sh
EOM
chmod +x $BIN_DIR/map-host-id
[[ -f image.info ]] && cp image.info /opt
.INCLUDE ./init/dirs.sh
if [[ -f build.env ]]; then
echo "-- sourcing /build/build.env --"
quiet ls -la
quiet cat build.env
quiet echo "----------------------"
source build.env
fi
if [[ -f ./init.sh ]]; then if [[ -f ./init.sh ]]; then
echo "############## Running Script init.sh of build source #################" echo "### Running Script init.sh of $BUILD_NAME build source with ${SHELL:-/bin/bash} ####"
quiet echo "----- build environment ------" quiet echo "----- build environment ------"
quiet env quiet env
quiet echo "----- env ------" quiet echo "----- env ------"
@ -65,15 +30,10 @@ if [[ -f ./init.sh ]]; then
quiet cat ./init.sh quiet cat ./init.sh
quiet echo "-------------------------------------------------------------" quiet echo "-------------------------------------------------------------"
# init.sh must have shebang and be executable # init.sh must have shebang and be executable
if ! $SHELL ./init.sh; then return 1; fi if ! ${SHELL:-/bin/bash} ./init.sh; then return 1; fi
echo "############## Finished running init.sh build script #########################" echo "############## Finished running init.sh build script #########################"
fi fi
.INCLUDE ./init/profile.sh
echo "****** creating user and group 'host' with ids 1000 *****"
groupadd -g 1000 host
useradd -r -g host -u 1000 host
# map host id now based on build environment # map host id now based on build environment
if [[ $VOLUME_DIRS ]]; then if [[ $VOLUME_DIRS ]]; then
echo "*** creating and configuring volume directories ***" echo "*** creating and configuring volume directories ***"

View File

@ -1,25 +0,0 @@
if [[ -d env/ ]]; then
export ENV_DIR=/opt/env
echo "############## Adding Environment Directroy $ENV_DIR #################"
echo "export ENV_DIR=${ENV_DIR}" >> /tmp/profile
quiet echo "copying env/ to $ENV_DIR"
/bin/cp -R -p env/. $ENV_DIR
quiet ls -la $ENV_DIR
fi
if [[ -d bin/ ]]; then
echo "############## Copying to Binary Directroy $BIN_DIR #################"
quiet echo "copying bin/ to $BIN_DIR"
/bin/cp -R -p bin/. $BIN_DIR
# chmod -R +x $BIN_DIR
quiet ls -la $BIN_DIR
fi
if [[ -d lib/ ]]; then
export LIB_DIR=/opt/lib
echo "############## Adding Library Directroy $LIB_DIR #################"
echo "export LIB_DIR=${LIB_DIR}" >> /tmp/profile
quiet echo "copying lib/ to $LIB_DIR"
/bin/cp -R -p lib/. $LIB_DIR
chmod -R +x $LIB_DIR
quiet ls -la $LIB_DIR
fi

View File

@ -1,29 +0,0 @@
#!/bin/bash
# to maintain variable $ in container script espcape with \$
# otherwise subtitution will happen during build
case "\$1" in
maphostid)
shift 1
/bin/bash -l -c '\$BIN_DIR/map-host-id \$@' \$0 "\$@"
;;
shell)
/bin/bash -c "cd \${INITIAL_DIR:-/opt}; exec bash -l"
;;
help)
.INCLUDE ./init/help.sh
;;
image)
.INCLUDE ./init/image-info.sh
;;
script)
shift 1
cat | /bin/bash -l
;;
${ENTRYPOINT_CMD:-start})
shift 1
/bin/bash -l -c '${ENTRYPOINT_CMD_PATH:-$BIN_DIR/start} \$@' \$0 "\$@"
;;
*)
/bin/bash -l -c '"\$@"' \$0 "\$@"
;;
esac

View File

@ -1,14 +0,0 @@
cat <<HELP
--------- ENTRYPOINT HELP ----------
commands are shell,maphostid,help,image and a custom command <start>
otherwise you can pass any shell command such as 'ls -la'
the current container custom command is > ${ENTRYPOINT_CMD:-start}
and the script for that command is in ${ENTRYPOINT_CMD_PATH:-$BIN_DIR/start}
-----
you can replace this start script with your own
your own script in $BIN_DIR/start in your build source directory
or set the \$ENTRYPOINT_CMD and \$ENTRYPOINT_CMD_PATH variables
It is possible to override the container entrypoint with your own
but is not recommmended as then a login shell will not be used
and critical environment variables will not be set
HELP

View File

@ -1,5 +0,0 @@
if [[ -f /opt/image.info ]]; then
echo -e "\n--------- image info found at /opt/image.info----------"
cat /opt/image.info
echo -e "\n****************************"
fi

View File

@ -1,9 +0,0 @@
#!/bin/bash
if [[ $VOLUME_DIRS ]]; then
echo changing ownership of directories $VOLUME_DIRS
echo to ${HOST_MAP:-"host:host"}
declare usesudo
[[ ! $EUID -eq 0 ]] && usesudo=sudo
$usesudo chown -R ${HOST_MAP:-"host:host"} $VOLUME_DIRS
ls -la $VOLUME_DIRS
fi

View File

@ -1,12 +0,0 @@
[[ -f $ENV_DIR/run.env ]] && echo 'source $ENV_DIR/run.env' >> /tmp/profile
while read line; do
if ! grep -q "$line" /etc/profile; then
quiet echo added $line to /etc/profile
echo $line >> /etc/profile
fi
done < /tmp/profile
# echo "echo /etc/profile has been sourced" >> /etc/profile
quiet echo "&&&&&&& last 10 of /etc/profile &&&&&"
quiet tail /etc/profile
quiet echo "%%%%%%%%%%%%%%%%%%%%%%%%%%%"

View File

@ -1,17 +0,0 @@
#!/bin/bash
#***** CONTAINER DEFAULT CUSTOM SCRIPT ******************"
case "$1" in
sub1)
echo this would be a subcommand #1
echo with arguments $@
;;
sub2)
shift 1
echo this would be a subcommand #1
echo with arguments $@
;;
*)
echo "running this command $*"
echo within login shell
/bin/bash -c '"$@"' $0 "$@"
esac

View File

@ -0,0 +1,5 @@
# PACKAGES
RUN --mount=type=bind,source=.src/packages,target=/build \
<<eot
.INCLUDE packages.tpl
eot

View File

@ -1,20 +1,32 @@
#!/bin/bash
% %
if [[ $REBUILD == "packages" ]]; then if [[ $REBUILD == "packages" ]]; then
echo "## Busting Cache, Forcing Rebuild $(date)" echo "## Busting Cache, Forcing Rebuild $(date)"
fi fi
% %
echo -e "\n ************************************************* \n" echo "************* PACKAGE INSTALLATION ***********************"
echo "Building Image from Base: $BASE_IMAGE" if ! { [ "$VERBOSE" = "packages" ] || [ "$VERBOSE" = "all" ]; }; then unset VERBOSE; fi
echo "Distro: $LINUX_DISTRO" source /opt/lib/verbose.lib
echo " ---- running packages install script ---" source /opt/core_run.env
if [[ $LINUX_DISTRO == "alpine" ]]; then echo Distro is $LINUX_DISTRO
echo "-------------------------------" echo package installer command for this build: "$INSTALL_PKGS"
echo "adding shadow bash and bash completion coreutils for alpine" echo package update command for this build: "$UPDATE_PKGS"
echo "to be compatible with other distros" if [[ -f ./packages.lst || -f ./packages.sh ]]; then
apk add --no-cache shadow bash bash-completion coreutils if [[ -f ./packages.lst ]]; then
echo "-------------------------------" echo "----- Installing Packages ---------------"
fi _pkgs=$(< ./packages.lst)
cd packages echo $_pkgs
/bin/sh ./packages.sh echo ....
cd .. silence ${INSTALL_PKGS} ${_pkgs}
echo -e "\n********************************************************" echo "done ----- Installing Packages ---------------"
fi
if [[ -f ./packages.sh ]]; then
echo "---- Running package installation script packages.sh -----"
/bin/bash -l ./packages.sh
echo "done ---- Running package installation script packages.sh -----"
fi
else
echo neither packages.lst, nor packages.sh in source
echo nothing to install!
fi
echo "********************************"

160
build
View File

@ -3,8 +3,9 @@
udbuild () { udbuild () {
local targets=(dev arm64 amd64 publish multi default) local targets=(dev arm64 amd64 publish multi default)
local log_dir; local no_prompt local log_dir; local no_prompt; local packages
local append_efile declare -A dimage; declare -A dinstall; declare -A dupdate
declare OPTION; declare OPTARG; declare OPTIND declare OPTION; declare OPTARG; declare OPTIND
BDIR=$(dirname "$(realpath "$BASH_SOURCE")") BDIR=$(dirname "$(realpath "$BASH_SOURCE")")
@ -54,81 +55,78 @@ case "$1" in
;; ;;
esac esac
exit_abnormal() { # Function: Exit with error.
usage
return ${1:-1}
}
[[ -z "$PS1" ]] || no_prompt=true [[ -z "$PS1" ]] || no_prompt=true
overwrite=true overwrite=true
while getopts 'fg:e:b:d:t:nc:r:u:lhs:a:voi:p' OPTION; do while getopts 'a:b:c:d:e:f:g:hi:lnopr:s:t:u:v:' OPTION; do
# echo processing: option:$OPTION argument:$OPTARG index:$OPTIND remaining:${@:$OPTIND} # echo processing: option:$OPTION argument:$OPTARG index:$OPTIND remaining:${@:$OPTIND}
case "$OPTION" in case "$OPTION" in
i)
IMAGE_INFO=$OPTARG
;;
e)
BUILD_EFILE=$OPTARG
if ! source_env_file $BUILD_EFILE; then return 2; fi
;;
o)
unset overwrite
;;
v)
VERBOSE=true
;;
a) a)
append_efile=$OPTARG APPEND_BUILD_ENV=$OPTARG
;;
f)
REBUILD=init
;;
p)
echo "build script will be run WITHOUT user prompts (i.e. non-interactive)"
no_prompt=true
;; ;;
b) b)
# CUSTOM BASE IMAGE # CUSTOM BASE IMAGE
BASE_IMAGE=$OPTARG BASE_IMAGE=$OPTARG
;; ;;
s) c)
# building source from which to bind into build, default is src/ in current directory TRY_CMD=$OPTARG
BUILD_SRC=$OPTARG ;;
;;
d) d)
# LINUX_DISTRO=$OPTARG # LINUX_DISTRO=$OPTARG
LINUX_DISTRO=$OPTARG LINUX_DISTRO=$OPTARG
;; ;;
e)
BUILD_EFILE=$OPTARG
if ! source_env_file $BUILD_EFILE; then return 2; fi
;;
f)
REBUILD=$OPTARG
;;
g)
TAG=$OPTARG
;;
h)
usage
return 0
;;
i)
IMAGE_INFO=$OPTARG
;;
o)
unset overwrite
;;
v)
VERBOSE=$OPTARG
;;
l) l)
# append distro name to image name # append distro name to image name
APPEND_DISTRO=true APPEND_DISTRO=true
;; ;;
t)
TARGET=$OPTARG
;;
g)
TAG=$OPTARG
;;
u)
RUSER=$OPTARG
;;
c)
TRY_CMD=$OPTARG
;;
n) n)
nocache="--no-cache" nocache="--no-cache"
;; ;;
p)
echo "build script will be run WITHOUT user prompts (i.e. non-interactive)"
no_prompt=true
;;
r) r)
REPO=$OPTARG REPO=$OPTARG
;; ;;
h) s)
exit_abnormal 0 # building source from which to bind into build, default is src/ in current directory
return 0 BUILD_SRC=$OPTARG
;; ;;
t)
TARGET=$OPTARG
;;
u)
RUSER=$OPTARG
;;
*) *)
echo "unknown $0 option -$OPTARG" echo "unknown $0 option -$OPTARG"
exit_abnormal 1 usage
return 1
;; ;;
esac esac
done done
@ -140,22 +138,22 @@ shift $((OPTIND - 1))
if ! get_build_src; then if ! get_build_src; then
if [[ $no_prompt ]] ; then if [[ $no_prompt ]] ; then
echo aborting the build... echo aborting the build...
echo -e "\e[1;31mNOTE: use '_default_' to explicitly use build source in uci-docker-build repo\e[1;37m" echo -e "\e[1;31mNOTE: use '_core_' to explicitly build with only the UCI core repo\e[1;37m"
return 2 return 2
else else
echo "Do you want to use the uci-docker-build default build source" echo "Do you want to build with only the UCI core"
echo "at $BDIR/src "
read -n 1 -p "instead? [y]=>" REPLY read -n 1 -p "instead? [y]=>" REPLY
[[ $REPLY != "y" ]] && echo -e "\n" && return 2 [[ $REPLY != "y" ]] && echo -e "\n" && return 2
BUILD_SRC=$BDIR/src BUILD_SRC="_core_"
echo -e "\n\e[1;31mNOTE: use '_default_' to explicitly use build source in uci-docker-build repo\e[1;37m" echo -e "\n\e[1;31mNOTE: use '_core_' to explicitly build with only the UCI core\e[1;37m"
fi fi
fi fi
TARGET=${TARGET:-default} TARGET=${TARGET:-default}
[[ ! "${targets[@]}" =~ $TARGET ]] && echo $TARGET is not a valid target && echo valid targets are: ${targets[@]} && exit 4 [[ ! "${targets[@]}" =~ $TARGET ]] && echo $TARGET is not a valid target && echo valid targets are: ${targets[@]} && exit 4
get_distro LINUX_DISTRO=${LINUX_DISTRO:-alpine}
if ! get_base_image; then return $?; fi
IMAGE_NAME=$(make_image_name $@) IMAGE_NAME=$(make_image_name $@)
@ -184,6 +182,7 @@ export LINUX_DISTRO
export BUILD_SRC export BUILD_SRC
export ARCH export ARCH
export VERBOSE export VERBOSE
export REBUILD
build_info build_info
@ -209,30 +208,53 @@ if [[ $TARGET == "publish" ]]; then
popd > /dev/null || return 4 popd > /dev/null || return 4
fi fi
# copy or bind build source directory to temporary .src/ subdirectory in build repo
[[ -d $BDIR/.src ]] && rm -rf $BDIR/.src if [[ ! $BUILD_SRC = "_core_" ]]; then
if [[ $(which rsync 2> /dev/null ) ]]; then # copy or bind build source directory to temporary .src/ subdirectory in build repo
rsync -aAru ${BUILD_SRC:-src}/ $BDIR/.src [[ -d $BDIR/.src ]] && rm -rf $BDIR/.src
else if [[ $(which rsync 2> /dev/null ) ]]; then
echo no rsync copying with cp rsync -aAru ${BUILD_SRC:-src}/ $BDIR/.src
/bin/cp -a ${BUILD_SRC:-src}/. $BDIR/.src > /dev/null 2>&1 else
echo no rsync copying with cp
/bin/cp -a ${BUILD_SRC:-src}/. $BDIR/.src > /dev/null 2>&1
fi
fi fi
if [[ -f $append_efile ]]; then if [[ -f $APPEND_BUILD_ENV ]]; then
/bin/cp "$append_efile" "$BDIR/.src/init/env/_build.env_" echo "------ Including custom build environment at $APPEND_BUILD_ENV -------"
echo 'source $ENV_DIR/_build.env_' >> $BDIR/.src/init/build.env cat $APPEND_BUILD_ENV
echo -e "\n--------------------"
echo | tee -a "$BDIR/.src/init/build.env" > /dev/null
tee -a "$BDIR/.src/init/build.env" > /dev/null < "$APPEND_BUILD_ENV"
cat "$APPEND_BUILD_ENV" > "$BDIR/core/build.env"
# run in subshell to not affect $USER
/bin/bash <<"EOF"
unset USER
source "$BDIR/core/build.env"
[[ $USER_PW ]] && USER=${USER:-sysadmin}
if [[ $USER ]]; then
if [[ -f $PWD/$USER-permits ]]; then
echo sudo permits file: \'$USER-permits\' added to core build
/bin/cp -f $PWD/$USER-permits $BDIR/core
fi
fi
EOF
fi fi
pushd "$BDIR" > /dev/null || return 3 pushd "$BDIR" > /dev/null || return 3
######### RUNNING THE DOCKER BUILD COMMAND ###################### echo -e "\n\e[1;31m######### RUNNING THE DOCKER BUILD COMMAND ######################"
echo running build command: docker buildx --builder ${builder} bake ${nocache} ${TARGET} echo running build command: docker buildx --builder ${builder} bake ${nocache} ${TARGET}
echo -e "#################################################################\e[1;37m"
docker buildx --builder ${builder} bake ${nocache} ${TARGET} 2>&1 | tee "$log_dir/${IMAGE_NAME//\//-}build.log" docker buildx --builder ${builder} bake ${nocache} ${TARGET} 2>&1 | tee "$log_dir/${IMAGE_NAME//\//-}build.log"
[[ $? == 0 ]] && echo succcess building image $IMAGE_NAME || exit_abnormal 5 [[ $? == 0 ]] && echo succcess building image $IMAGE_NAME || exit_abnormal 5
popd > /dev/null || return 4 popd > /dev/null || return 4
rm -rf $BDIR/.src # cleanup
echo cleaning up..
rm -rf $BDIR/.src $BDIR/core/build.env $BDIR/core/*-permits > /dev/null 2<&1
echo done cleaning
# try in container
if [[ ($TRY_CMD || $TARGET == "dev") ]]; then if [[ ($TRY_CMD || $TARGET == "dev") ]]; then
echo trying newly built image in a container echo trying newly built image in a container
echo name before try $IMAGE_NAME echo name before try $IMAGE_NAME

39
core/core.sh Normal file
View File

@ -0,0 +1,39 @@
#!/bin/bash
echo "------------- CORE INSTALLATION ------------"
source /opt/core_run.env
if [[ -f ./build.env ]]; then
echo sourcing a custom core build enviornment
cat ./build.env
echo "--------"
source ./build.env
fi
source $LIB_DIR/verbose.lib
echo appending pkg commands to core_run.env
echo appending sourcing of $ENV_DIR/run.env if it exists
cat <<ENV >> /opt/core_run.env
export INSTALL_PKGS="$INSTALL_PKGS"
export UPDATE_PKGS="$UPDATE_PKGS"
[ -f "\$ENV_DIR/run.env" ] && [ -z "\$BUILDING" ] && source \$ENV_DIR/run.env
ENV
quiet cat /opt/core_run.env
mkdir -p /etc/profile.d
echo creating login sourcing file for core_run.env in /etc/profile.d
echo "source /opt/core_run.env" > /etc/profile.d/01-core-run-env.sh
quiet ls -la /etc/profile.d
echo "--------- creating user and group 'host' with ids 1000 -----"
echo "done --------- creating user and group 'host' with ids 1000 -----"
cat <<DOC >> /etc/login.defs
SYS_UID_MAX 1001"
SYS_GID_MAX 1001"
DOC
groupadd -g 1000 host
echo "SYS_UID_MAX 1001" >> /etc/login.defs
useradd -r -g host -u 1000 host
[[ $USER_PW ]] && export USER=${USER:-sysadmin}
[[ $USER ]] && /bin/bash user.sh
[[ $UCI_SHELL ]] && /bin/bash uci-shell.sh
$BIN_DIR/map-host-id /opt
ls -la /opt
echo "done ------------- CORE INSTALLATION ------------"

41
core/opt/bin/entrypoint Executable file
View File

@ -0,0 +1,41 @@
#!/bin/bash
source /opt/core_run.env
case "$1" in
maphostid)
shift 1
/bin/bash -l -c '$BIN_DIR/map-host-id $@' $0 "$@"
;;
image)
shift 1
/bin/bash -l -c '$BIN_DIR/image-info $@' $0 "$@"
;;
shell)
shift 1
_shell_=/bin/bash
[[ $1 ]] && _shell_="/bin/su $1"
$_shell_ -c "cd ${INITIAL_DIR:-/opt}; exec bash -l"
;;
help)
$BIN_DIR/entrypoint-help
;;
script)
shift 1
cat | /bin/bash -l
;;
${ENTRYPOINT_CMD:-start})
shift 1
/bin/bash -l -c '${ENTRYPOINT_CMD_PATH:-$BIN_DIR/start} $@' $0 "$@"
;;
*)
echo command passed to container "$*"
if [ -n "$*" ]; then
if ! /bin/bash -l -c '$@' $0 "$@" ; then
$BIN_DIR/entrypoint-help
fi
else
echo no command was passed to entrypoint
echo
$BIN_DIR/entrypoint-help
fi
;;
esac

33
core/opt/bin/entrypoint-help Executable file
View File

@ -0,0 +1,33 @@
#!/bin/bash
cat <<HELP
--------- ENTRYPOINT HELP ----------
entrypoint commands are shell, maphostid, help, image, script and a custom command (start, by default)
otherwise you can pass any shell command such as 'ls -la'
----- Custom Command (start) -------------
the current container custom command is > ${ENTRYPOINT_CMD:-start}
and the script/binary that command runs is ${ENTRYPOINT_CMD_PATH:-$BIN_DIR/start}
you can replace this start script with your own or any binary
placed at init/opt/bin/start in your build source directory
or set the \$ENTRYPOINT_CMD_PATH and (optionally) the \$ENTRYPOINT_CMD variables
---------- script ---------------
you can pipe a script from the host to container with this command
script < test.sh
if you use a heredoc you can delay variable substition
until the command is run in container.
script << "SCRIPT"
echo $BIN_DIR
SCRIPT
----- Overwrite Entrypoint
It is also possible to completely override the container entrypoint with your own
$BIN_DIR/entrypoint script but is not recommmended as then a bash login shell is
assured (unless you see to it) and thus critical runtime environment variables
will not be set
HELP

10
core/opt/bin/image-info Executable file
View File

@ -0,0 +1,10 @@
#!/bin/bash
if [[ -f /opt/image.info ]]; then
echo -e "\n--------- image info found at /opt/image.info----------"
cat /opt/image.info
echo -e "\n****************************"
else
echo no image information found at /opt/image.info
echo "you can place one at 'init/image.info' in your source (src) directory"
echo "to be included in the image"
fi

12
core/opt/bin/map-host-id Executable file
View File

@ -0,0 +1,12 @@
#!/bin/bash
vdirs=${1:-$VOLUME_DIRS}
if [[ $vdirs ]]; then
echo changing ownership of directories $vdirs
vgroup=host
[[ ! $USER = "root" && $USER ]]; vgroup=$USER
vmap=${HOST_MAP:-host:$vgroup}
echo to $vmap
declare usesudo
[[ ! $USER = "root" ]] && usesudo=sudo
$usesudo chown -R $vmap $vdirs
fi

26
core/opt/bin/start Executable file
View File

@ -0,0 +1,26 @@
#!/bin/bash
#***** CONTAINER DEFAULT CUSTOM SCRIPT ******************"
echo "------ EXAMPLE 'start' command script -----"
echo replace with your /opt/bin/start or use
echo "export ENTRYPOINT_CMD=mycmd"
echo "export ENTRYPOINT_CMD_PATH=\$BIN_DIR/mycmd"
echo and supply a init/opt/mycmd in your source
echo "---------------"
case "$1" in
sub1)
echo "this is the 'start' subcommand 'sub2' "
echo with arguments $@
;;
sub2)
shift 1
echo "this is the 'start' subcommand 'sub2' "
echo with arguments $@
;;
*)
echo
echo "running this command $*"
echo "via the 'start' command"
echo within a login shell
/bin/bash -l -c '"$@"' $0 "$@"
esac
echo "done------ EXAMPLE 'start' command script -----"

5
core/opt/core_run.env Normal file
View File

@ -0,0 +1,5 @@
export ENV_DIR=/opt/env
export BIN_DIR=/opt/bin
export LIB_DIR=/opt/lib
export SHELL=/bin/bash
PATH=$BIN_DIR:$PATH

35
core/opt/lib/distro.lib Executable file
View File

@ -0,0 +1,35 @@
#!/bin/sh
load_csv () (
# add newline, remove comments, remove empty lines, remove extra whitespace around ,
csv=${1:-/opt/lib/distros.csv}
if [ -f $csv ]; then
sed -e '$a\' "$csv" | \
sed -e '/\s*#.*$/d' | \
sed -e '/^\s*$/d' | \
sed 's/\s*,\s*/,/g'
else
return 1
fi
)
validate_distro () (
release=${1:-/etc/os-release}
distros=$(echo $(echo "$(load_csv)" | grep -Eo "^[^,]+") | sed "s/\s/|/g")
#echo valids:$distros
distro=$(cat $release | tr [:upper:] [:lower:] | grep -Eio -m 1 $distros)
# echo debug: c $distro p $LINUX_DISTRO
if [ "$LINUX_DISTRO" = "$distro" ]; then
echo $distro
else
return 1
fi
)
set_distro () {
_distro="$(echo "$(load_csv)" | grep $LINUX_DISTRO)"
INSTALL_PKGS=$(echo $_distro | cut -d',' -f3)
UPDATE_PKGS=$(echo $_distro | cut -d',' -f4)
export INSTALL_PKGS
export UPDATE_PKGS
}

View File

@ -0,0 +1,7 @@
# valid distros list
# the distro must be the name used in /etc/os-release
# <distro>,<core image name>,<install command>,<update command>
alpine,alpine, apk add --no-cache, apk update
debian,debian, apt-get install -y, apt-get update
arch, archlinux,pacman -S --noconfirm --needed,pacman -Syu
ubuntu, ubuntu, apt-get install -y, apt-get update
1 # valid distros list
2 # the distro must be the name used in /etc/os-release
3 # <distro>,<core image name>,<install command>,<update command>
4 alpine,alpine, apk add --no-cache, apk update
5 debian,debian, apt-get install -y, apt-get update
6 arch, archlinux,pacman -S --noconfirm --needed,pacman -Syu
7 ubuntu, ubuntu, apt-get install -y, apt-get update

7
core/opt/lib/distros.csv Normal file
View File

@ -0,0 +1,7 @@
# valid distros list
# the distro must be the name used in /etc/os-release
# <distro>,<core image name>,<install command>,<update command>
alpine,alpine, apk add --no-cache, apk update
debian,debian, apt-get install -y, apt-get update
arch, archlinux,pacman -S --noconfirm --needed,pacman -Syu
ubuntu, ubuntu, apt-get install -y, apt-get update
1 # valid distros list
2 # the distro must be the name used in /etc/os-release
3 # <distro>,<core image name>,<install command>,<update command>
4 alpine,alpine, apk add --no-cache, apk update
5 debian,debian, apt-get install -y, apt-get update
6 arch, archlinux,pacman -S --noconfirm --needed,pacman -Syu
7 ubuntu, ubuntu, apt-get install -y, apt-get update

10
core/opt/lib/verbose.lib Normal file
View File

@ -0,0 +1,10 @@
quiet () {
if [ -n "$VERBOSE" ]; then $@; fi
}
silence() {
if [ -n "$VERBOSE" ] ; then
"$@"
else
"$@" > /dev/null
fi
}

22
core/packages.sh Normal file
View File

@ -0,0 +1,22 @@
#!/bin/sh
echo "------------- CORE PACKAGE INSTALLATION ------------"
echo UPDATING PACKAGE REGISTRY....
. /opt/lib/verbose.lib
silence $UPDATE_PKGS
echo .... DONE!
if [ -f ./packages/$LINUX_DISTRO ]; then
echo INSTALLING $LINUX_DISTRO DISTRO SPECIFIC PACKAGES
_pkgs=$(cat ./packages/$LINUX_DISTRO)
echo $_pkgs
echo ....
silence $INSTALL_PKGS $_pkgs
echo "DONE INSTALLING $LINUX_DISTRO SPECIFIC PACKAGES"
fi
echo INSTALLING COMMON PACKAGES FOR ANY DISTRO
quiet this is a test of quiet
_pkgs=$(cat ./packages/common)
echo $_pkgs
echo ....
silence $INSTALL_PKGS $_pkgs
echo "DONE INSTALLING COMMON PACKAGES"
echo "done ------------- CORE PACKAGE INSTALLATION ------------"

1
core/packages/alpine Normal file
View File

@ -0,0 +1 @@
shadow

View File

@ -1,9 +1,9 @@
bash
bash-completion
coreutils
wget wget
curl curl
git git
rsync
sudo
nano nano
coreutils sudo
bash
bash-completion

0
core/packages/ubuntu Normal file
View File

20
core/uci-shell.sh Executable file
View File

@ -0,0 +1,20 @@
#!/bin/bash
echo -e "\n------------ ADD UCI-SHELL ---------------"
mkdir -p /shell
_url=https://git.kebler.net/bash/shell-base.git
git clone $_url /shell
source /shell/install/install.sh
[[ $USER ]] && mkdir -p /home/$USER/shell
uci_bash_shell_install $USER
if [[ $USER ]]; then
chown -R $USER:$USER /shell
chmod -R g+rw /shell
setfacl -d --set u::rwx,g::rwx,o::- /shell
chown -R :host /home/$USER/shell
chmod -R g+rw /home/$USER/shell
setfacl -d --set u::rwx,g::rwx,o::- /home/$USER/shell
fi
echo "----------- uci shell install complete ------"

39
core/user.sh Executable file
View File

@ -0,0 +1,39 @@
#!/bin/bash
USER=${1:-$USER}
USER_PW=${2-$USER_PW}
if [[ $USER ]]; then
echo "------- Adding USER: $USER ------"
source $LIB_DIR/verbose.lib
echo loading acl package
silence $INSTALL_PKGS acl
echo "------- Adding User: $USER ------"
groupadd -g 1001 $USER
useradd -rm -s /bin/bash -G host,$([[ $(getent group sudo) ]] && echo sudo || echo wheel) -g $USER -u 1001 $USER
echo $USER groups: $(groups $USER)
chpasswd <<< "sysadmin:${USER_PW:-$USER}"
# SUDOERS Setup
cat <<SUDO >> /etc/sudoers.d/01-sudo-wheel
Defaults lecture = never
%wheel ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
SUDO
chmod 440 /etc/sudoers.d/01-sudo-wheel
cat <<USER >> /etc/sudoers.d/02-$USER
$USER ALL = NOPASSWD:/bin/chown
$USER ALL = NOPASSWD:/bin/chmod
USER
chmod 440 /etc/sudoers.d/02-$USER
if [[ -f $USER-permits ]]; then
echo "--- $USER-permits file supplied copying to /etc/sudoers.d ---"
cat $USER-permits
cat $USER-permits >> /etc/sudoers.d/02-$USER
fi
chmod g+rw /opt
setfacl -d --set u::rwx,g::rwx,o::- /opt
echo "done------- Adding USER: $USER ------"
fi

1
distros.csv Symbolic link
View File

@ -0,0 +1 @@
./core/opt/lib/distros.csv
1 ./core/opt/lib/distros.csv

View File

@ -11,10 +11,10 @@ variable "IMAGE_NAME" {
variable "BASE_IMAGE" { variable "BASE_IMAGE" {
// default = "alpine" // default = "alpine"
} }
variable "SYSADMIN_PW" { variable "VERBOSE" {
default = "" default = ""
} }
variable "VERBOSE" { variable "REBUILD" {
default = "" default = ""
} }
variable "ARCH" { variable "ARCH" {
@ -48,7 +48,7 @@ target "amd64" {
BASE_IMAGE = "${BASE_IMAGE}" BASE_IMAGE = "${BASE_IMAGE}"
TAG = "${TAG}" TAG = "${TAG}"
VERBOSE = "${VERBOSE}" VERBOSE = "${VERBOSE}"
SYSADMIN_PW = "${SYSADMIN_PW}" REBUILD = "${REBUILD}"
} }
tags = tag("amd64") tags = tag("amd64")
platforms = ["linux/amd64"] platforms = ["linux/amd64"]

2
example/build.env Normal file
View File

@ -0,0 +1,2 @@
export USER_PW=ucommandit
export UCI_SHELL=true

44
example/example.env Normal file
View File

@ -0,0 +1,44 @@
# UCI Build Script environment file
# for easy use copy this file to .env and it will be sourced
# using a filename of just .env in pwd will load it by default
# otherwise invoke `udbuild -e example.env`
# Default base images are set in distros.csv
# if BASE_IMAGE is unset then the default for LINUX_DISTRO will
# be used and the default LINUX_DISTRO is alpine
# BASE_IMAGE="dockerhubuser/mybase"
# a set LINUX_DISTRO is over written by distro of BASE_IMAGE if set
# LINUX_DISTRO=alpine
# tag of created image will be 'latest' by default
# TAG=1.0.0
# RUSER will be prepended to image name with /, and is used mostly for publishing
RUSER=example
# remote repository for pushing, default is hub.docker.com
# REPO=my.priviate.repo.net
# default target is "default" , other targets, dev, publish, amd64, arm64
# TARGET=publish
# if unset BUILD_SRC will be determined by a search
# Search looks for looks for /init and /packages
# in $PWD,$PWD/<src>/,../$PWD,../$PWD/<src>
# otherwise you can set an absolute or relative path, or use _core_'
# If BUILD_SRC can not be determined or is unset
# you will be given the option to build just with the uci core
# BUILD_SRC=../src
# For a custom container build environment
# create an environment file and then set
# this file will sourced by the "core" RUN of the build
# and also the "init" RUN
# Otherwise you can "hard code" build container envirnomnet
# at /init/build.env which is only sourced by the "init" RUN
APPEND_BUILD_ENV=./build.env

3
example/image.info Normal file
View File

@ -0,0 +1,3 @@
This is an example image built from the
source found in example/ directory of
the uci-docker-build repo

3
example/shell Executable file
View File

@ -0,0 +1,3 @@
echo invoking a shell in container image for a non root user ${1:-sysadmin}
echo assuming one was added in build
udbuild try -e example.env shell $1

View File

@ -0,0 +1,8 @@
# anything in here will be sourced ONLY during build
# allows easy custom environment variables
# /opt/core_run.env is always sourced before this file
# /opt/env/run.env is NOT sourced by default during build but you
# can explicity add it there
# [ -f "$ENV_DIR/run.env" ] && $ENV_DIR/run.env
export SOMEBUILDONLYVALUE="yes!"
export VOLUME_DIRS="/opt"

7
example/src/init/init.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/bash
echo custom initialization script
echo "----- CONTAINER RUN ENVIRONMENT ---"
cat $ENV_DIR/run.env
echo -e "-n--------------------"

2
example/src/init/opt/bin/mycmd Executable file
View File

@ -0,0 +1,2 @@
echo "this is my custom entrypoint command script, mycmd"
echo "arguments that were passed: $*"

7
example/src/init/opt/env/run.env vendored Normal file
View File

@ -0,0 +1,7 @@
# set these to customize the "custom" entrypoint command
export ENTRYPOINT_CMD=mycmd
export ENTRYPOINT_CMD_PATH=$BIN_DIR/mycmd
# here you could put specific exports
# or source another file, whatever. this is sourced at shell login
export INITIAL_DIR=/opt/bin
export NONSENSE="this is from the run.env file"

7
example/src/init/opt/env/run.env.example vendored Executable file
View File

@ -0,0 +1,7 @@
# set these to customize the "custom" entrypoint command
export ENTRYPOINT_CMD=mycmd
export ENTRYPOINT_CMD_PATH=$BIN_DIR/mycmd
# here you could put specific exports
# or source another file, whatever. this is sourced at shell login
export INITIAL_DIR=/opt/bin
export NONSENSE="this is from the run.env file"

View File

@ -1,5 +1,5 @@
If you create/edit a image.info file in your source If you create/edit a image.info file in your source
at the init/ subfolder then it will be including in the build at the init/opt subfolder then it will be including in the build
as /opt/image.info. as /opt/image.info.
So this text comes from the default image.info file So this text comes from the default image.info file
in the src/init folder of the default build source in the src/init folder of the default build source

View File

@ -0,0 +1,11 @@
#!/bin/bash
echo env
_url=https://raw.githubusercontent.com/KittyKatt/screenFetch/master/screenfetch-dev
wget --quiet -O $BIN_DIR/os-info $_url > /dev/null
if [[ -f $BIN_DIR/os-info ]]; then
chmod +x $BIN_DIR/os-info
else
echo Failed to download
echo $_url
echo info screen not available
fi

View File

@ -0,0 +1,2 @@
rsync

View File

@ -0,0 +1,9 @@
#!/bin/bash
echo custom package installer script
echo "--------HERE IS THE ENVIRONMENT-------"
env
echo "--------------------"
echo "installing a fancy OS info script"
/bin/bash ./install-os-info.sh
echo now running the os-info script, a command in PATH at $BIN_DIR/os-info
os-info

10
example/sysadmin-permits Normal file
View File

@ -0,0 +1,10 @@
# allow admins to change group and user ids
# sysadmin ALL = NOPASSWD : ALL
# or specify
sysadmin ALL = NOPASSWD:/bin/cp
# sysadmin ALL = NOPASSWD:/sbin/groupmod
# sysadmin ALL = NOPASSWD:/sbin/usermod
# sysadmin ALL = NOPASSWD:/sbin/adduser
# sysadmin ALL = NOPASSWD:/sbin/addgroup
# sysadmin ALL = NOPASSWD:/sbin/useradd
# sysadmin ALL = NOPASSWD:/sbin/groudadd

View File

@ -1,2 +1,2 @@
# invokes build with the example environment file # invokes build with the example environment file
udbuild try -e example.env ${@:-shell} udbuild try -e example.env $@

3
example/try-opt Executable file
View File

@ -0,0 +1,3 @@
# invokes build with the example environment file
echo mounting /opt from container to ./mnt/opt in PWD
udbuild try -e example.env -m opt ${@:-shell} $@

View File

@ -1,29 +0,0 @@
# for easy use copy this file to .env and it will be sourced
# otherwise invoke `udbuild -e example.env`
# using a filename of just .env will load it by default
# LINUX_DISTRO ignored if BASE_IMAGE is set
# LINUX_DISTRO=alpine
# BASE_IMAGE="dockerhubuser/mybase"
# tag is 'latest' by default
# TAG=1.0.0
# will be prepended to image name with /, used mostly for publishing
RUSER=testing
# default is hub.docker.com
# REPO=my.priviate.repo.net
# if using base source this will set the pw for the sysadmin user in the image
SYSADMIN_PW=ucommandit
# default target is "default"
# TARGET=publish
BUILD_SRC=../src
# looks for /init and /packages in present directory by default
# also looks in src/ subdirectory
# relate paths work
# use '_base_' to force using the uci-docker-build build source
# BUILD_SRC=._base_
# in the image where the build scripts are put /build by default

View File

@ -113,26 +113,57 @@ source_env_file () {
} }
docker_image_distro() { load_csv () {
local temp=/tmp/os-release.tmp # add newline, remove comments, remove empty lines, remove extra whitespace around ,
docker create --name dummy $1 > /dev/null if [[ -f $1 ]]; then
docker cp -L dummy:/etc/os-release $temp sed -e '$a\' "$1" | \
docker rm -f dummy > /dev/null sed -e '/\s*#.*$/d' | \
echo $(cat $temp | tr [:upper:] [:lower:] | grep -Poi '(debian|ubuntu|red hat|centos|arch|alpine)' | uniq) sed -e '/^\s*$/d' | \
rm $temp sed 's/\s*,\s*/,/g'
else
return 1
fi
} }
get_distro() { get_default_distro_image () {
local distro
distro="$(echo "$(load_csv $BDIR/distros.csv)" | grep $LINUX_DISTRO)"
echo $distro | cut -d',' -f2
}
LINUX_DISTRO=${LINUX_DISTRO:-alpine} validate_image_distro() {
local temp=/tmp/os-release.tmp
if [[ $BASE_IMAGE ]]; then local distro; local distros
quiet echo determining DISTRO of base image: $BASE_IMAGE if docker create --name dummy $1 > /dev/null; then
LINUX_DISTRO=$(docker_image_distro $BASE_IMAGE) if docker cp -L dummy:/etc/os-release $temp > /dev/null; then
[[ ! $LINUX_DISTRO ]] && quiet echo "unable to get base image OS for: $BASE_IMAGE, aborting build" && return 5 docker rm -f dummy > /dev/null
quiet echo $BASE_IMAGE is built from distro $LINUX_DISTRO distros=$(echo $(echo "$(load_csv $BDIR/distros.csv)" | grep -Eo "^[^,]+") | sed "s/\s/|/g")
distro=$(cat $temp | tr [:upper:] [:lower:] | grep -Eio -m 1 $distros)
rm $temp
[[ ! $distro ]] && echo "image $1 is not a valid distro ($distros)" && return 1
[[ ! "$distro" == "${2:-$LINUX_DISTRO}" ]] && echo "image ${1}'s distro ($distro) is NOT build distro (${2:-$LINUX_DISTRO})" && return 1
quiet echo "base image $1 distro ($distro) has been validated"
else
echo "unable to retreive /etc/os-release from image $1, unable to determine image distro"
fi
else else
BASE_IMAGE=$LINUX_DISTRO echo "there is no image $1 locally or at docker hub, can't set the base image"
return 1
fi
}
get_base_image() {
[[ ! $BASE_IMAGE ]] && BASE_IMAGE=$(get_default_distro_image)
if [[ $BASE_IMAGE ]]; then
quiet echo determining DISTRO of base image: $BASE_IMAGE
if ! validate_image_distro $BASE_IMAGE; then
echo "unable to get or use base image: $BASE_IMAGE, aborting build" && return 5
fi
quiet echo $BASE_IMAGE is built from distro $LINUX_DISTRO
else
echo unable to determine a base image, aborting build
return 6
fi fi
} }
@ -172,11 +203,13 @@ get_build_src () {
# processing the build source directory # processing the build source directory
local src; local spath; local spaths local src; local spath; local spaths
check_dir () { check_dir () {
[[ ( -d $1/packages && -d $1/init ) ]] || return 1 [[ -f $1/init/init.sh ]] || return 1
[[ ( -f $1/packages/packages.lst || -f $1/packages/packages.sh ) ]] && _packages_=true
return 0
} }
src=${1:-$BUILD_SRC} src=${1:-$BUILD_SRC}
[[ $src == "_default_" ]] && src=${BDIR}/src [[ $src == "_core_" ]] && return 0
src=${src:-src} src=${src:-src}
unset BUILD_SRC unset BUILD_SRC
@ -185,10 +218,10 @@ if check_dir $src; then
return 0 return 0
fi fi
echo build source path \'$src\' not initially found echo build source path \'$src\' not initially found, echo looking
echo looking in parent directories for a valid build source directory echo in \$PWD,\$PWD/src/,../\$PWD/src for valid build source
echo to avoid this search use BUILD_SRC= in an environment file echo to avoid this search use BUILD_SRC= in an environment file
spaths="$PWD $(dirname $PWD)/$src $(dirname $PWD)" spaths="$PWD $PWD/src $(dirname $PWD)/$src $(dirname $PWD)"
for spath in $spaths; do for spath in $spaths; do
echo checking for source in: $spath echo checking for source in: $spath
if check_dir $spath; then if check_dir $spath; then
@ -205,8 +238,6 @@ done
build_info () { build_info () {
echo "Build Command: docker buildx --builder ${builder} bake ${nocache} ${TARGET}"
if [[ $VERBOSE ]]; then if [[ $VERBOSE ]]; then
echo -e "\n!!!!!!!!!!!!!!!!EXTRA BUILD INFO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo -e "\n!!!!!!!!!!!!!!!!EXTRA BUILD INFO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
pushd "$BDIR" > /dev/null || return 3 pushd "$BDIR" > /dev/null || return 3
@ -222,11 +253,21 @@ fi
echo -e "\e[1;37m**************BUILD PARAMETERS *******************************" echo -e "\e[1;37m**************BUILD PARAMETERS *******************************"
echo "Architecture of this machine doing the building: $ARCH" echo "Architecture of this machine doing the building: $ARCH"
echo "Using scripts source directory at $BUILD_SRC" if [[ $BUILD_SRC="_core_" ]] ;then
echo "Building with base image: $BASE_IMAGE" echo Building ONLY the UCI core
else
echo "Using scripts source directory at $BUILD_SRC"
fi
echo "Building with base image: $BASE_IMAGE"$([[ "${BASE_IMAGE}" == *":"* ]] || echo :latest)
echo "Build logs can be found in directory $log_dir" echo "Build logs can be found in directory $log_dir"
echo "Linux Distro of Image: $LINUX_DISTRO" echo "Linux Distro of Image: $LINUX_DISTRO"
echo "Using build target: ${TARGET}" echo "Using build target: ${TARGET}"
if [[ -f $APPEND_BUILD_ENV ]]; then
echo "Will append contents of $APPEND_BUILD_ENV to build envionrment"
echo "-------"
cat $APPEND_BUILD_ENV
echo "-------"
fi
echo "----- output --------" echo "----- output --------"
echo creating image echo creating image
case $TARGET in case $TARGET in

View File

@ -42,7 +42,6 @@ TAG=${tag:-$TAG}
name=${1%:*} name=${1%:*}
shift shift
get_distro
echo $(make_image_name $name $@)$([[ $suffix ]] && echo -$suffix):${TAG:-latest} echo $(make_image_name $name $@)$([[ $suffix ]] && echo -$suffix):${TAG:-latest}
} }

View File

@ -86,7 +86,6 @@ try_container () {
if [[ ! ( $build && $image ) ]]; then if [[ ! ( $build && $image ) ]]; then
echo attempting to getting image name from environment file echo attempting to getting image name from environment file
get_distro
source_env_file $efile source_env_file $efile
image=$(make_image_name) image=$(make_image_name)
fi fi
@ -141,7 +140,7 @@ END
if [[ ! $dry_run ]]; then if [[ ! $dry_run ]]; then
echo starting container with image: $image, and name $name echo starting container with image: $image, and name $name
echo at container prompt type \'exit\' to exit from shell and remove trial container echo -e "at container prompt type 'exit' to exit from shell and remove trial container\n"
fi fi
dcmd=$( tr "\n" " " <<-END dcmd=$( tr "\n" " " <<-END
docker run -i $([[ ! $script ]] && echo -t) docker run -i $([[ ! $script ]] && echo -t)
@ -160,7 +159,7 @@ END
$([[ -f $script ]] && echo cat || echo "echo") "$script" | $dcmd $([[ -f $script ]] && echo cat || echo "echo") "$script" | $dcmd
else else
$dcmd $dcmd
echo "done with session, removing containter try-$name" echo -e "\ndone with session, removing containter try-$name"
if [[ $mp ]] ; then if [[ $mp ]] ; then
echo removing volume $vname used for mapping echo removing volume $vname used for mapping
docker volume rm $vname > /dev/null docker volume rm $vname > /dev/null

1
lib/distros.csv Symbolic link
View File

@ -0,0 +1 @@
../core/opt/lib/distros.csv
1 ../core/opt/lib/distros.csv

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
declare libdir declare libdir
libdir=$(dirname "$(realpath "$BASH_SOURCE")") libdir=$(dirname "$(realpath "$BASH_SOURCE")")
source $libdir/helpers.lib source $libdir/build.lib
for f in $libdir/cmds/*.sh; do for f in $libdir/cmds/*.sh; do
# echo sourcing: $f >&2 # echo sourcing: $f >&2
source "$f" source "$f"

6
lib/tester Executable file
View File

@ -0,0 +1,6 @@
declare -A distros
. ./build.lib
LINUX_DISTRO=arch
BDIR=../
get_distro
echo $BASE_IMAGE

View File

@ -1 +0,0 @@
echo initialization script for alpine distro

View File

@ -1 +0,0 @@
echo initialization script for archlinux distro

View File

@ -1,7 +0,0 @@
# anything in here will be sourced during build
# allows easy custom environment variables
# by sourcing run.env in build will available in build
[[ $ENV_DIR && -f $ENV_DIR/run.env ]] && source $ENV_DIR/run.env
# export VOLUME_DIRS="/opt"

View File

@ -1,24 +0,0 @@
#!/bin/bash
echo -e "\n##################################"
# which groupadd
# which useradd
# which /bin/bash
# echo SHELL $SHELL
# groupadd -g 1000 host
# useradd -r -g host -u 1000 host
# git clone https://git.kebler.net/bash/shell-base.git /shell/base
# export SHELL=/bin/bash
# mkdir -p /home/sysadmin/shell
# /bin/bash /shell/base/install/install.sh sysadmin
# echo "******** uci shell install complete **********"
# # make essential directories
# mkdir -p $VOLUME_DIRS /opt/bin
# chown -R :host /home/sysadmin/shell
# chown -R host:host $VOLUME_DIRS
# chmod -R g+rw /home/sysadmin/shell $VOLUME_DIRS
# ls -la /home/sysadmin/shell $VOLUME_DIRS
echo installing and running image distro info
/bin/bash install-os-info.sh
/opt/bin/os-info

View File

@ -1,9 +0,0 @@
#!/bin/bash
wget --quiet -O /opt/bin/os-info https://git.io/vaHfR > /dev/null
if [[ -f /opt/bin/os-info ]]; then
chmod +x /opt/bin/os-info
else
echo Failed to download
echo "https://raw.githubusercontent.com/KittyKatt/screenFetch/master/screenfetch-dev"
echo info screen not available
fi

View File

@ -1,2 +0,0 @@
#!/bin/sh
echo initialization script for debian distro

View File

@ -1,3 +0,0 @@
# added /opt/run.env to the end of /etc/profile
export SHELL=/bin/bash
export INITIAL_DIR=/opt

View File

@ -1,21 +0,0 @@
#!/bin/bash
echo "running base init.sh script in /build"
# remove other distro files
# find $PWD -maxdepth 1 -type d ! -path $PWD ! -name ${LINUX_DISTRO} ! -name common -exec rm -rf {} +
cd ${LINUX_DISTRO} || exit 1
echo " ----- Running ${LINUX_DISTRO} specific init script ----- ";
/bin/bash init.sh
cd ..
cd common || exit 1
echo " ***** Running common initialzation script *****"
ls -la;
/bin/bash init.sh;
cd ..
cd ${LINUX_DISTRO} || exit 1
echo " ----- Running ${LINUX_DISTRO} specific post commont script ----- ";
if [[ -f post_common.sh ]]; then
echo "running distro specific commands after common install in post_common.sh"
/bin/bash post_common.sh
echo returned from ${LINUX_DISTRO} post common script
fi
cd ..

View File

@ -1,117 +0,0 @@
#!/bin/bash
add-ppa () {
if [ $EUID != 0 ]; then
sudo bash -c "$(declare -f add-ppa); add-ppa $*"
else
VERSION=jammy
KEYSDIR=/etc/apt/trusted.gpg.d
KEYSERVER=keyserver.ubuntu.com
declare OPTION; declare OPTARG; declare OPTIND
while getopts 'v:p:s:k:c:d:oi' OPTION; do
echo processing: option:$OPTION argument:$OPTARG index:$OPTIND remaining:${@:$OPTIND}
case "$OPTION" in
i)
INSTALL=true
;;
v)
VERSION=$OPTARG
;;
p)
PACKAGE=$OPTARG
;;
c)
CMD=$OPTARG
;;
d)
KEYSDIR=$OPTARG
;;
s)
KEYSERVER=$OPTARG
;;
o)
# overwrite any exising public key
KEYOVERWRITE=true
;;
*) echo unknown run option -$OPTARG
echo "USAGE: add-ppa <options> package/branch (e.g. git-core/ppa)"
echo "available options -v <ubnutu version name - default Jammy>; -p <apt install package name if not the same>"
;;
esac
done
shift $((OPTIND - 1))
#check input
if [ -z ${1+x} ]; then
echo "No ppa provided!"
return 1
fi
LAUNCHPAD="https://ppa.launchpadcontent.net"
DEV=$(echo $1 | cut -d ':' -f 2 | cut -d '/' -f1 )
PACKAGE=${PACKAGE:-$DEV}
CMD=${CMD:-$PACKAGE}
BRANCH=${2:-$(echo $1| cut -d '/' -f 2)}
URL="$LAUNCHPAD/$DEV/$BRANCH/ubuntu $VERSION main"
echo "*********** Adding PPA Repository ************"
echo DEVELOPER: $DEV
echo BRANCH: $BRANCH
echo PACKAGE: $PACKAGE
echo COMMAND: $CMD
echo URL: $URL
if [[ -t 0 ]]; then
read -n 1 -p "do you want to continue [y]=>" REPLY
[[ $REPLY != "y" ]] && return 0
fi
echo -e "\n*********************************************"
#create source list file
echo "deb $URL" > /etc/apt/sources.list.d/$DEV.list
echo "***** added /etc/apt/sources.list.d/$DEV.list with****"
cat /etc/apt/sources.list.d/$DEV.list
echo "*********************************************"
KEYFILE=$KEYSDIR/$DEV.gpg
[[ $KEYOVERWRITE ]] && rm $KEYFILE
if [ ! -f $KEYFILE ]; then
# using an update error to grab key id
KEY_ERROR=/tmp/${DEV}_key_error
touch $KEY_ERROR
apt-get update > /dev/null 2> $KEY_ERROR
cat $KEY_ERROR
KEY=$(sed -n 's/^.*NO_PUBKEY //p' "$KEY_ERROR" | head -1)
# echo Reposity Public Key Settings
# echo KEYS DIRECTORY: $KEYSDIR
# echo KEY SERVER: $KEYSERVER
# echo KEY: $KEY
if [ ! $KEY ]; then
echo can not determine $DEV/$BRANCH key sign
echo "removing file: /etc/apt/sources.list.d/$DEV.list and aborting"
rm /etc/apt/sources.list.d/$DEV.list
return 1
fi
echo downloading and saving public key $KEY for $DEV/$BRANCH to $KEYFILE
gpg --keyserver $KEYSERVER --recv $KEY
gpg --export $KEY > $KEYFILE
else
echo " >>>>>> $KEYFILE already exists, using that key $KEY <<<<<"
fi
echo ppa repo $DEV/$BRANCH for package $PACKAGE now registered, updating...
apt-get update 1> /dev/null
if [[ $INSTALL ]]; then
echo installing $PACKAGE
[[ -t 0 ]] && apt policy $PACKAGE
apt-get install $PACKAGE -y
$CMD --version
fi
fi
}
# # if script was executed then call the function
(return 0 2>/dev/null) || add-ppa $@

View File

@ -1,2 +0,0 @@
#!/bin/bash
echo intialization script for ubuntu distro

View File

@ -1,8 +0,0 @@
#!/bin/sh
echo install packages for alpine distro
apk update; apk upgrade;
pwd; ls -la
echo ">>>> installing packages => alpine: $(cat ./packages); common: $(cat ../common/packages)"
apk add --no-cache $(cat ./packages) $(cat ../common/packages)

View File

@ -1,8 +0,0 @@
#!/bin/sh
echo install packages for archlinux distro
pacman -Syu
pwd; ls -la
echo ">>>> installing packages => arch: $(cat ./packages); common: $(cat ../common/packages)"
pacman -S --needed --noconfirm $(cat ./packages) $(cat ../common/packages)
pacman -Scc --noconfirm

View File

@ -1,2 +0,0 @@
ca-certificates
gpg

View File

@ -1,5 +0,0 @@
#!/bin/bash
echo install packages for ubuntu distro
apt-get update
echo ">>>> installing packages => $(cat packages) $(cat ../common/packages)"
apt-get install $(cat packages) $(cat ../common/packages) -y

View File

@ -1,6 +0,0 @@
#!/bin/sh
echo "installing packages.... for $LINUX_DISTRO"
cd ${LINUX_DISTRO} || exit 1
/bin/sh packages.sh
cd ..

View File

@ -1,117 +0,0 @@
#!/bin/bash
add-ppa () {
if [ $EUID != 0 ]; then
sudo bash -c "$(declare -f add-ppa); add-ppa $*"
else
VERSION=jammy
KEYSDIR=/etc/apt/trusted.gpg.d
KEYSERVER=keyserver.ubuntu.com
declare OPTION; declare OPTARG; declare OPTIND
while getopts 'v:p:s:k:c:d:oi' OPTION; do
echo processing: option:$OPTION argument:$OPTARG index:$OPTIND remaining:${@:$OPTIND}
case "$OPTION" in
i)
INSTALL=true
;;
v)
VERSION=$OPTARG
;;
p)
PACKAGE=$OPTARG
;;
c)
CMD=$OPTARG
;;
d)
KEYSDIR=$OPTARG
;;
s)
KEYSERVER=$OPTARG
;;
o)
# overwrite any exising public key
KEYOVERWRITE=true
;;
*) echo unknown run option -$OPTARG
echo "USAGE: add-ppa <options> package/branch (e.g. git-core/ppa)"
echo "available options -v <ubnutu version name - default Jammy>; -p <apt install package name if not the same>"
;;
esac
done
shift $((OPTIND - 1))
#check input
if [ -z ${1+x} ]; then
echo "No ppa provided!"
return 1
fi
LAUNCHPAD="https://ppa.launchpadcontent.net"
DEV=$(echo $1 | cut -d ':' -f 2 | cut -d '/' -f1 )
PACKAGE=${PACKAGE:-$DEV}
CMD=${CMD:-$PACKAGE}
BRANCH=${2:-$(echo $1| cut -d '/' -f 2)}
URL="$LAUNCHPAD/$DEV/$BRANCH/ubuntu $VERSION main"
echo "*********** Adding PPA Repository ************"
echo DEVELOPER: $DEV
echo BRANCH: $BRANCH
echo PACKAGE: $PACKAGE
echo COMMAND: $CMD
echo URL: $URL
if [[ -t 0 ]]; then
read -n 1 -p "do you want to continue [y]=>" REPLY
[[ $REPLY != "y" ]] && return 0
fi
echo -e "\n*********************************************"
#create source list file
echo "deb $URL" > /etc/apt/sources.list.d/$DEV.list
echo "***** added /etc/apt/sources.list.d/$DEV.list with****"
cat /etc/apt/sources.list.d/$DEV.list
echo "*********************************************"
KEYFILE=$KEYSDIR/$DEV.gpg
[[ $KEYOVERWRITE ]] && rm $KEYFILE
if [ ! -f $KEYFILE ]; then
# using an update error to grab key id
KEY_ERROR=/tmp/${DEV}_key_error
touch $KEY_ERROR
apt-get update > /dev/null 2> $KEY_ERROR
cat $KEY_ERROR
KEY=$(sed -n 's/^.*NO_PUBKEY //p' "$KEY_ERROR" | head -1)
# echo Reposity Public Key Settings
# echo KEYS DIRECTORY: $KEYSDIR
# echo KEY SERVER: $KEYSERVER
# echo KEY: $KEY
if [ ! $KEY ]; then
echo can not determine $DEV/$BRANCH key sign
echo "removing file: /etc/apt/sources.list.d/$DEV.list and aborting"
rm /etc/apt/sources.list.d/$DEV.list
return 1
fi
echo downloading and saving public key $KEY for $DEV/$BRANCH to $KEYFILE
gpg --keyserver $KEYSERVER --recv $KEY
gpg --export $KEY > $KEYFILE
else
echo " >>>>>> $KEYFILE already exists, using that key $KEY <<<<<"
fi
echo ppa repo $DEV/$BRANCH for package $PACKAGE now registered, updating...
apt-get update 1> /dev/null
if [[ $INSTALL ]]; then
echo installing $PACKAGE
[[ -t 0 ]] && apt policy $PACKAGE
apt-get install $PACKAGE -y
$CMD --version
fi
fi
}
# # if script was executed then call the function
(return 0 2>/dev/null) || add-ppa $@

View File

@ -1,2 +0,0 @@
ca-certificates
gpg

View File

@ -1,6 +0,0 @@
#!/bin/bash
echo install packages for ubuntu distro
apt-get update
echo ">>>> installing packages => $(cat packages) $(cat ../common/packages)"
apt-get install $(cat packages) $(cat ../common/packages) -y
./add-ppa.sh -i -p git git-core/ppa