Compare commits

...

13 Commits

9 changed files with 324 additions and 99 deletions

View File

@ -5,15 +5,18 @@ Welcome to Rx3-Docker/Docker Tools!
This project aims to give some basic tools to be used by other Rx3 docker packaging projects.
Features:
- docker_tools_install & docker_mk_dir to setup a new application environment,
- docker_mk_env command to compile env file into .env file,
- docker_start, docker_stop & docker_logs command,
- docker_network_up & docker_network_down automatically called to setup external network rule & route,
- docker_service_add env file function,
- docker_build_push.
- docker_build_push,
Support different mounted volume modes:
- Single,
- Merged, (Old mode)
- Splited. (Default)
- Mixed (Old mode),
- Merged,
- Splited (Default).
Enjoy it!

View File

@ -1,10 +1,75 @@
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.4.0 - A. GIBERT - 2025/04/XX
------------------------------------------------------------------------------------------------------------------------------------
- Add docker_network_up & docker_network_down scripts called by docker_start & docker_stop.
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.3.7 - A. GIBERT - 2025/03/31
------------------------------------------------------------------------------------------------------------------------------------
- Remove ${service_name} == ${APPL_NAME} exception handling for *_IMG_URL.
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.3.6 - A. GIBERT - 2025/01/31
------------------------------------------------------------------------------------------------------------------------------------
- Add a new DOCKER_TOOLS_USER_GROUP_FORCE env variable support.
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.3.5 - A. GIBERT - 2025/01/24
------------------------------------------------------------------------------------------------------------------------------------
- Add a new DOCKER_TOOLS_VOLUME mode: "MIXED".
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.3.4 - A. GIBERT - 2025/01/13
------------------------------------------------------------------------------------------------------------------------------------
- Replace ENV_SED by ENV_NET_SED environment variable.
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.3.3 - A. GIBERT - 2025/01/05
------------------------------------------------------------------------------------------------------------------------------------
- Add DOCKER_TOOLS_EXEPTION_LOGS env variable support,
- Remove .env.sed file obsoleted by ENV_SED environment variable.
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.3.2 - A. GIBERT - 2024/12/27
------------------------------------------------------------------------------------------------------------------------------------
- Add docker_config_add function for docker_mk_env to support config file generation.
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.3.1 - A. GIBERT - 2024/12/14
------------------------------------------------------------------------------------------------------------------------------------
- Add docker_mk_dir & docker_tools_install commands.
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.3.0 - A. GIBERT - 2024/11/26
------------------------------------------------------------------------------------------------------------------------------------
- Improve docker_service_add function,
- Switch by default to splited volume mode,
- Add DOCKER_TOOLS_DEBUG, DOCKER_TOOLS_VOLUME & DOCKER_TOOLS_EXECPTION_LIBS env variable support.
- Add DOCKER_TOOLS_DEBUG, DOCKER_TOOLS_VOLUME & DOCKER_TOOLS_EXEPTION_LIBS env variable support.
- Warning: API break!

33
sbin/docker_mk_dir Executable file
View File

@ -0,0 +1,33 @@
#!/bin/bash
#-------------------------------------------------------------------------------
#set -o errexit
grep -e _LOG_ -e _LIB_ .env | grep -e _EXT= | while read line
do
OIFS=$IFS
IFS="="
set $line
IFS=$OIFS
grep $1 compose.yaml >/dev/null
if [[ "$?" == "0" ]]
then
eval echo $2
fi
done | sort -u | while read dir
do
echo "Add/Create: [${dir}]"
mkdir -p ${dir}
echo -e '# Ignore everything in this directory\n*\n# Except this file\n!.gitignore' > ${dir}/.gitignore
git add ${dir}/.gitignore
done

View File

@ -3,27 +3,34 @@
#-------------------------------------------------------------------------------
#
# DOCKER_TOOLS_DEBUG= TRUE | FALSE # Enable debugging (Default FALSE)
# DOCKER_TOOLS_DEBUG= TRUE | FALSE # Enable debugging (Default FALSE)
#
# DOCKER_TOOLS_VOLUME= SINGLE | MERGED | SPLITED # Default: SPLITED
# DOCKER_TOOLS_VOLUME= SINGLE | MIXED | MERGED | SPLITED # Default: SPLITED
# SINGLE: Merged volume mode + No service suffix
# MERGED: Merged volume mode + Service suffix
# MIXED: Merged volume mode + Init/SV log Service suffix
# MERGED: Merged volume mode + Full service suffix
# SPLITED: By service volume mode + No service suffix
#
# DOCKER_TOOLS_EXECPTION_LIBS="module_name:lib_dir_name ..."
# Example: postgres:pgsq
# DOCKER_TOOLS_EXEPTION_LIBS="module_name:lib_dir_name ..."
# Example: "postgres:pgsq httpd:/var/www/html"
#
# DOCKER_TOOLS_EXEPTION_LOGS="module_name:log_dir_name ..."
# Example: "postgres:web-server:httpd"
#
# DOCKER_TOOLS_USER_GROUP_FORCE= TRUE | FALSE # Force using curent user / group (Default FALSE)
#
#-------------------------------------------------------------------------------
set -o errexit
if [[ "$DOCKER_TOOLS_DEBUG" == "TRUE" ]]
if [[ "${DOCKER_TOOLS_DEBUG}" == "TRUE" ]]
then
set -x
fi
APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
DYNVAR_LIST="APPL_HOME_DIR"
CONFIG_FILE_LIST=""
version="$1"
@ -66,7 +73,26 @@ function module_lib_name_get
{
module=$1
for tup in ${DOCKER_TOOLS_EXECPTION_LIBS}
for tup in ${DOCKER_TOOLS_EXEPTION_LIBS}
do
if [[ "${module}" == "${tup/:*}" ]]
then
echo ${tup/*:}
return
fi
done
echo "${module}"
}
#-------------------------------------------------------------------------------
function module_log_name_get
{
module=$1
for tup in ${DOCKER_TOOLS_EXEPTION_LOGS}
do
if [[ "${module}" == "${tup/:*}" ]]
then
@ -114,10 +140,10 @@ function docker_service_add
if [[ "${service_name}" == "${APPL_NAME}" ]]
then
dynvar_export "${varible_prefix}_IMG_URL" "${target_url_prefix}:${target_version}"
# dynvar_export "${varible_prefix}_IMG_URL" "${target_url_prefix}:${target_version}"
dynvar_export "${varible_prefix}_HOST_NAME" "$( psfix_cat "${HOST_NAME_PREFIX}" "-" "webapp")"
else
dynvar_export "${varible_prefix}_IMG_URL" "${target_url_prefix}/${target_name}:${target_version}"
# dynvar_export "${varible_prefix}_IMG_URL" "${target_url_prefix}/${target_name}:${target_version}"
dynvar_export "${varible_prefix}_HOST_NAME" "$( psfix_cat "${HOST_NAME_PREFIX}" "-" "${service_name}")"
fi
@ -164,29 +190,62 @@ function docker_service_add
volume_prefix="./mnt/${service_name}"
fi
if [[ "${DOCKER_TOOLS_VOLUME}" != "MERGED" ]]
if [[ "${DOCKER_TOOLS_VOLUME}" == "SINGLE" ]] || [[ "${DOCKER_TOOLS_VOLUME}" == "SPLITED" ]]
then
volume_suffix_ext=""
volume_suffix_initsv_ext=""
volume_suffix_module_ext=""
else
volume_suffix_ext="${service_name}"
volume_suffix_initsv_ext="${service_name}"
if [[ "${DOCKER_TOOLS_VOLUME}" == "MIXED" ]]
then
volume_suffix_module_ext=""
else
volume_suffix_module_ext="${service_name}"
fi
fi
module_lib_name="$( module_lib_name_get "${module_name}")"
if [[ "${module_lib_name}" != /* ]]
then
path_prefix="/var/lib/"
else
path_prefix=""
fi
dynvar_export "${varible_prefix}_LIB_INT" "/var/lib/${module_lib_name}"
dynvar_export "${varible_prefix}_LIB_EXT" "$( psfix_cat "${volume_prefix}/var/lib/${module_lib_name}" "-" "${volume_suffix_ext}")"
module_lib_path=${path_prefix}${module_lib_name}
module_log_name="$( module_log_name_get "${module_name}")"
if [[ "${module_log_name}" != /* ]]
then
path_prefix="/var/log/"
else
path_prefix=""
fi
module_log_path=${path_prefix}${module_log_name}
dynvar_export "${varible_prefix}_LIB_INT" "${module_lib_path}"
dynvar_export "${varible_prefix}_LIB_EXT" "$( psfix_cat "${volume_prefix}${module_lib_path}" "-" "${volume_suffix_module_ext}")"
dynvar_export "${varible_prefix}_LOG_INIT_INT" "/var/log/init"
dynvar_export "${varible_prefix}_LOG_INIT_EXT" "$( psfix_cat "${volume_prefix}/var/log/init" "-" "${volume_suffix_ext}")"
dynvar_export "${varible_prefix}_LOG_INIT_EXT" "$( psfix_cat "${volume_prefix}/var/log/init" "-" "${volume_suffix_initsv_ext}")"
dynvar_export "${varible_prefix}_LOG_SV_INT" "/var/log/supervisor"
dynvar_export "${varible_prefix}_LOG_SV_EXT" "$( psfix_cat "${volume_prefix}/var/log/supervisor" "-" "${volume_suffix_ext}")"
dynvar_export "${varible_prefix}_LOG_SV_EXT" "$( psfix_cat "${volume_prefix}/var/log/supervisor" "-" "${volume_suffix_initsv_ext}")"
dynvar_export "${varible_prefix}_LOG_MAIN_INT" "/var/log/${module_name}"
dynvar_export "${varible_prefix}_LOG_MAIN_EXT" "$( psfix_cat "${volume_prefix}/var/log/${module_name}" "-" "${volume_suffix_ext}")"
dynvar_export "${varible_prefix}_LOG_MAIN_INT" "${module_log_path}"
dynvar_export "${varible_prefix}_LOG_MAIN_EXT" "$( psfix_cat "${volume_prefix}${module_log_path}" "-" "${volume_suffix_module_ext}")"
# Ports
if [[ "${port_main_int}" != "-" ]]
@ -215,6 +274,11 @@ function docker_service_add
user_name="-"
user_id="-"
else
if [[ "${DOCKER_TOOLS_USER_GROUP_FORCE}" == "TRUE" ]]
then
user_name_id=$( id -u)
fi
if [[ "${user_name_id}" =~ ^[0-9]+$ ]]
then
user_name="-"
@ -234,6 +298,11 @@ function docker_service_add
group_name="-"
group_id="-"
else
if [[ "${DOCKER_TOOLS_USER_GROUP_FORCE}" == "TRUE" ]]
then
group_name_id=$( id -g)
fi
if [[ "${group_name_id}" =~ ^[0-9]+$ ]]
then
group_name="-"
@ -251,85 +320,13 @@ function docker_service_add
#-------------------------------------------------------------------------------
function docker_service_add-12
function docker_config_add
{
varible_prefix="$1"
shift
for var in NAME NAME_FULL URL_PREFIX IMG_NAME APPL_NAME VERSION_EXT VERSION_INT PORT_MAIN_EXT PORT_MAIN_INT PORT_ADMIN_EXT PORT_ADMIN_INT USER_NAME GROUP_NAME
do
dynvar_export "${varible_prefix}_${var}" "$1"
shift
done
config_file_target="$1"
config_file_source="$2"
dynvar_export "${varible_prefix}_LOG_INIT_INT" "/var/log/init"
dynvar_export "${varible_prefix}_LOG_INIT_EXT" "./var/log/init-\${${varible_prefix}_NAME}"
dynvar_export "${varible_prefix}_LOG_SV_INT" "/var/log/supervisor"
dynvar_export "${varible_prefix}_LOG_SV_EXT" "./var/log/supervisor-\${${varible_prefix}_NAME}"
if [[ $( eval echo \${${varible_prefix}_APPL_NAME}) != "-" ]]
then
dynvar_export "${varible_prefix}_LIB_INT" "/var/lib/\${${varible_prefix}_APPL_NAME}"
dynvar_export "${varible_prefix}_LIB_EXT" "./var/lib/\${${varible_prefix}_APPL_NAME}"
dynvar_export "${varible_prefix}_LOG_MAIN_INT" "/var/log/\${${varible_prefix}_APPL_NAME}"
dynvar_export "${varible_prefix}_LOG_MAIN_EXT" "./var/log/\${${varible_prefix}_APPL_NAME}"
fi
if [[ $( eval echo \${${varible_prefix}_IMG_NAME}) != "-" ]]
then
# No Build
dynvar_export "${varible_prefix}_IMG_URL" "\${${varible_prefix}_URL_PREFIX}/\${${varible_prefix}_IMG_NAME}:\${${varible_prefix}_VERSION_EXT}"
else
# Build
dynvar_export "${varible_prefix}_IMG_URL" "\${${varible_prefix}_URL_PREFIX}/\${${varible_prefix}_NAME}:\${${varible_prefix}_VERSION_EXT}"
dynvar_export "${varible_prefix}_MODULE_NAME" "\${${varible_prefix}_NAME}"
dynvar_export "${varible_prefix}_MODULE_PATH" "src/\${${varible_prefix}_NAME}"
fi
dynvar_export "${varible_prefix}_CONTAINER_NAME" "${CONTAINER_NAME_PREFIX}-\${${varible_prefix}_NAME}"
dynvar_export "${varible_prefix}_HOST" "\${${varible_prefix}_CONTAINER_NAME}"
dynvar_export "${varible_prefix}_PORT_MAIN_EXT" "\$(( \${${varible_prefix}_PORT_MAIN_EXT} + ${PORT_ENV_OFFSET}))"
dynvar_export "${varible_prefix}_PORT_SV_EXT" "\$(( \${${varible_prefix}_PORT_MAIN_EXT} + ${PORT_SV_OFFSET}))"
dynvar_export "${varible_prefix}_PORT_SV_INT" "9001"
if [[ $( eval echo \${${varible_prefix}_PORT_ADMIN_EXT}) != "-" ]]
then
dynvar_export "${varible_prefix}_PORT_ADMIN_EXT" "\$(( \${${varible_prefix}_PORT_ADMIN_EXT} + ${PORT_ENV_OFFSET}))"
fi
if [[ $( eval echo \${${varible_prefix}_USER_NAME}) == "-" ]]
then
dynvar_export "${varible_prefix}_USER_ID" "-"
else
if [[ $( eval echo \${${varible_prefix}_USER_NAME}) =~ ^[0-9]+$ ]]
then
dynvar_export "${varible_prefix}_USER_ID" "\${${varible_prefix}_USER_NAME}"
else
dynvar_export "${varible_prefix}_USER_ID" "\$( id -u \${${varible_prefix}_USER_NAME})"
fi
fi
if [[ $( eval echo \${${varible_prefix}_GROUP_NAME}) == "-" ]]
then
dynvar_export "${varible_prefix}_GROUP_ID" "-"
else
if [[ $( eval echo \${${varible_prefix}_GROUP_NAME}) =~ ^[0-9]+$ ]]
then
dynvar_export "${varible_prefix}_GROUP_ID" "\${${varible_prefix}_GROUP_NAME}"
else
dynvar_export "${varible_prefix}_GROUP_ID" "\$( getent group \${${varible_prefix}_GROUP_NAME} | cut -d: -f3)"
fi
fi
dynvar_export "${varible_prefix}_CONTEXT_PATH" "/${APPL_NAME}/\${${varible_prefix}_NAME}/"
# dynvar_export "${varible_prefix}_" "${varible_prefix}_${}"
CONFIG_FILE_LIST+=" ${config_file_target}:${config_file_source}"
}
@ -350,8 +347,37 @@ fi
>${APPL_HOME_DIR}/.env
ENV_SED=""
ENV_NET_SED=""
for var in $( ( grep "^ *[a-zA-Z0-9_-]*=" ${APPL_HOME_DIR}/env | sed -e "s/=.*//" -e "s/ *//"; echo ${DYNVAR_LIST} | sed -e 's/ /\n/g') | sort -u)
do
echo "${var}='${!var}'" >>${APPL_HOME_DIR}/.env
echo "${var}='${!var}'" >>${APPL_HOME_DIR}/.env
pat="s/\${${var}}/${!var//\//\\/}/g
"
ENV_SED="${ENV_SED}${pat}"
if [[ ${var} =~ _HOST_ ]] || ( [[ ${var} =~ _PORT_ ]] && [[ ${var} =~ _INT ]])
then
ENV_NET_SED="${ENV_NET_SED}${pat}"
fi
done
echo ENV_NET_SED=\'"${ENV_NET_SED}"\' >>${APPL_HOME_DIR}/.env
for tupple in ${CONFIG_FILE_LIST}
do
IFS=":"
set ${tupple}
config_file_target="$1"
config_file_source="$2"
IFS=" "
sed <${config_file_source} >${config_file_target} -e "${ENV_SED}"
done

25
sbin/docker_network_down Executable file
View File

@ -0,0 +1,25 @@
#!/bin/bash
#-------------------------------------------------------------------------------
set -o errexit
APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
. .env
if [[ "${NETWORK_TABLE}" != "" ]]
then
if [[ "$( ip rule list | grep "from ${NETWORK_ADDRESS}")" != "" ]]
then
ip rule del from ${NETWORK_ADDRESS}
fi
if [[ "$( ip route list table ${NETWORK_TABLE} | grep "${NETWORK_SUBNET}")" != "" ]]
then
ip route del ${NETWORK_SUBNET} table ${NETWORK_TABLE}
fi
fi

21
sbin/docker_network_up Executable file
View File

@ -0,0 +1,21 @@
#!/bin/bash
#-------------------------------------------------------------------------------
set -o errexit
APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
. .env
if [[ "${NETWORK_TABLE}" != "" ]]
then
sbin/docker_network_down
ip rule add from ${NETWORK_ADDRESS} table ${NETWORK_TABLE}
ip route add ${NETWORK_SUBNET} dev ${NETWORK_IF_NAME} table ${NETWORK_TABLE}
fi

View File

@ -13,3 +13,5 @@ sbin/docker_mk_env
docker compose pull
docker compose up -d
sbin/docker_network_up

View File

@ -10,3 +10,5 @@ APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
docker compose down
sbin/docker_network_down

48
sbin/docker_tools_install Executable file
View File

@ -0,0 +1,48 @@
#!/bin/bash
#-------------------------------------------------------------------------------
set -o errexit
DOCKER_TOOLS_HOME_DIR="$(dirname "$(dirname "$0")")"
if [[ "$1" == "" ]]
then
APPL_HOME_DIR="$PWD"
else
APPL_HOME_DIR="$1"
fi
#-------------------------------------------------------------------------------
function link_create
{
source="$1"
target="$2"
if [[ -d "$target" ]]
then
real_target=${target}/$( basename "${source}")
else
real_target=${target}
fi
if [[ -e "${real_target}" ]]
then
mv ${real_target} ${real_target}.old
fi
ln -s ${source} ${target}
}
#-------------------------------------------------------------------------------
DOCKER_TOOLS_HOME_DIR=$( realpath --relative-to ${APPL_HOME_DIR} ${DOCKER_TOOLS_HOME_DIR})
cd ${APPL_HOME_DIR}
link_create ${DOCKER_TOOLS_HOME_DIR}/sbin .
link_create env.dist env