21 Commits

Author SHA1 Message Date
7d1adaced7 - Add mk_base_image script,
- Add SPEC files to generate docker_tools & docker_tools-devel RPM packages.
2026-03-23 23:27:43 +01:00
3b9b07fdf3 - Add docker_restart & docker_sbs scripts. 2026-02-28 07:13:21 +01:00
76d58b74a2 - Add cd in script to allow external docker application dir call. 2025-08-06 10:07:00 +02:00
925dda5d5b - Start Docker Tools 1.4 new features,
- Add docker_network_up & docker_network_down scripts called by docker_start & docker_stop.
2025-04-06 11:34:28 +02:00
7b50783d3c - Update relase note. 2025-03-31 11:34:32 +02:00
eebfc99b24 - Remove ${service_name} == ${APPL_NAME} exption hangling of *_IMG_URL. 2025-03-31 11:16:52 +02:00
4e2f7b927d - Add a new DOCKER_TOOLS_USER_GROUP_FORCE env variable support. 2025-01-31 16:27:41 +01:00
bf1177c71a - Add a new DOCKER_TOOLS_VOLUME mode: "MIXED". 2025-01-24 11:01:17 +01:00
22d7d17cd0 - Quick fix applied to broken docker_mk_dir... 2025-01-16 17:25:15 +01:00
b7170807d5 - Replace ENV_SED by ENV_NET_SED environment variable. 2025-01-13 10:36:28 +01:00
69b26b35bf - Remove .env.sed file obsoleted by ENV_SED environment variable. 2025-01-05 12:32:14 +01:00
7278a536fd - Add DOCKER_TOOLS_EXEPTION_LOGS env variable support. 2025-01-04 20:43:25 +01:00
ae36bab6ec - Fix docker_mk_env config sed generation. 2024-12-27 13:48:07 +01:00
7a4ee6f87f - Add docker_config_add command for docker_mk_env. 2024-12-23 00:00:27 +01:00
57fc0d82a5 - Add missing new files! 2024-12-16 10:27:35 +01:00
1ffaa822e6 - Add docker_mk_dir & docker_tools_install commands. 2024-12-14 08:40:32 +01:00
a1cdbcdac2 - Implement volume modes,
- Add DOCKER_TOOLS_VOLUME & DOCKER_TOOLS_EXECPTION_LIBS env variables.
2024-11-26 17:44:43 +01:00
7bf4bc661a - Add prefix_add function. 2024-11-25 01:08:25 +01:00
ce4241ff9e - Add service_name to docker_service_add function. 2024-11-23 10:50:07 +01:00
58f1259e90 - Improve docker_service_add function.
- Warning: API break!
2024-11-17 19:30:48 +01:00
9462b195c5 - Move repo from Rx3/docker_tools to Rx3-Docker/docker_tools,
- docker_service_add:
    - Add *_LOG_* variable generation,
- Add docker_build_push command.
2024-11-15 20:18:44 +01:00
15 changed files with 1233 additions and 45 deletions

View File

@@ -1,13 +1,25 @@
Welcome to Docker Tools!
Welcome to Rx3-Docker/Docker Tools!
This is project aims to give some basic tools to be used by others Rx3 docker packaging projects.
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_service_add env file function.
- docker_start, docker_stop , docker_restart & 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_sbs (Stop / Build / Start),
- mk_base_image to build a base image,
- distributed in two RPM packages: docker_tools & docker_tools-devel.
Support different mounted volume modes:
- Single,
- Mixed (Old mode),
- Merged,
- Splited (Default).
Enjoy it!
@@ -16,4 +28,4 @@ Your Docker Tools Team.
--
arnaud@rx3.net
https://git.rx3.org/gitea/rx3/docker_tools
https://git.rx3.org/gitea/rx3-docker/docker_tools

View File

@@ -1,3 +1,108 @@
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.5.0 - A. GIBERT - 2026/03/23
------------------------------------------------------------------------------------------------------------------------------------
- Add mk_base_image script,
- Add SPEC files to generate docker_tools & docker_tools-devel RPM packages.
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.4.1 - A. GIBERT - 2026/02/28
------------------------------------------------------------------------------------------------------------------------------------
- Add docker_restart & docker_sbs scripts.
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.4.0 - A. GIBERT - 2025/08/06
------------------------------------------------------------------------------------------------------------------------------------
- Add docker_network_up & docker_network_down scripts called by docker_start & docker_stop,
- Add cd in script to allow external docker application dir call.
------------------------------------------------------------------------------------------------------------------------------------
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_EXEPTION_LIBS env variable support.
- Warning: API break!
------------------------------------------------------------------------------------------------------------------------------------
Rx3-Docker/Docker Tools V 1.2.0 - A. GIBERT - 2024/11/15
------------------------------------------------------------------------------------------------------------------------------------
- Move repo from Rx3/docker_tools to Rx3-Docker/docker_tools,
- docker_service_add:
- Add *_LOG_* variable generation,
- Add docker_build_push command.
------------------------------------------------------------------------------------------------------------------------------------
Docker Tools V 1.1.0 - A. GIBERT - 2024/11/03
------------------------------------------------------------------------------------------------------------------------------------

166
SPECS/docker_tools.spec Normal file
View File

@@ -0,0 +1,166 @@
#-----------------------------------------------------------------------------------------------------------------------------------
#
# MPM (Meta Package Manager)
# Copyright (C) 2024-2026 Arnaud G. GIBERT
# mailto:arnaud@rx3.net
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
#-----------------------------------------------------------------------------------------------------------------------------------
%define name docker_tools
%define version 1.5.0
%define release %mkrel 1rx3
%global debug_package %{nil}
Name: %{name}
Version: %{version}
Release: %{release}
Summary: Rx3 Docker Management Tools
License: GPL
URL: https://git.rx3.org/gitea/rx3/%{name}
Source0: https://git.rx3.org/gitea/rx3/%{name}/archive/%{name}-%{version}.tar.gz
Distribution: Rx3 Free Software
Vendor: Rx3
Packager: Arnaud G. GIBERT <arnaud@rx3.net>
BuildArch: noarch
Requires: rx3-base
%description
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_restart & 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_sbs (Stop / Build / Start),
- mk_base_image to build a base image,
- distributed in two RPM packages: docker_tools & docker_tools-devel.
Support different mounted volume modes:
- Single,
- Mixed (Old mode),
- Merged,
- Splited (Default).
%package devel
Summary: Meta Package Manager - Server repository
Requires: rx3-base
Requires: buildah
%description devel
This project aims to give some basic tools to be used by other Rx3 docker packaging projects.
This is de development package, only needed for image creation.
#-----------------------------------------------------------------------------------------------------------------------------------
# Prep
#-----------------------------------------------------------------------------------------------------------------------------------
%prep
%setup -q -n %{name}
#-----------------------------------------------------------------------------------------------------------------------------------
# Build
#-----------------------------------------------------------------------------------------------------------------------------------
%build
#-----------------------------------------------------------------------------------------------------------------------------------
# Install
#-----------------------------------------------------------------------------------------------------------------------------------
%install
cd sbin
for file in *
do
install -D -pm 755 ${file} %{buildroot}%{_sbindir}/${file}
done
#-----------------------------------------------------------------------------------------------------------------------------------
# Check
#-----------------------------------------------------------------------------------------------------------------------------------
%check
#-----------------------------------------------------------------------------------------------------------------------------------
# Files
#-----------------------------------------------------------------------------------------------------------------------------------
%files
%doc ReadMe.txt ReleaseNotes.txt ToDo.txt
%license GNU_GPL-3.0.txt
%{_sbindir}/docker_logs
%{_sbindir}/docker_mk_env
%{_sbindir}/docker_network_*
%{_sbindir}/docker_restart
%{_sbindir}/docker_start
%{_sbindir}/docker_stop
%{_sbindir}/docker_tools_install
%files devel
%{_sbindir}/docker_build_push
%{_sbindir}/docker_mk_dir
%{_sbindir}/docker_sbs
%{_sbindir}/mk_base_image
#-----------------------------------------------------------------------------------------------------------------------------------
# ChangeLog
#-----------------------------------------------------------------------------------------------------------------------------------
%changelog
* Sun Mar 22 2026 Arnaud G. GIBERT <arnaud@rx3.net> - 1.5.0-1rx3.mga9
- Create initial SPEC file for 1.5.0 on Mageia 9

18
sbin/docker_build_push Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
#-------------------------------------------------------------------------------
set -o errexit
APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
cd ${APPL_HOME_DIR}
sbin/docker_mk_env
docker compose build
docker compose push

View File

@@ -9,4 +9,7 @@ APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
cd ${APPL_HOME_DIR}
docker compose logs -f

40
sbin/docker_mk_dir Executable file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
#-------------------------------------------------------------------------------
#set -o errexit
APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
cd ${APPL_HOME_DIR}
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

@@ -1,10 +1,36 @@
#!/bin/bash
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
#
# DOCKER_TOOLS_DEBUG= TRUE | FALSE # Enable debugging (Default FALSE)
#
# DOCKER_TOOLS_VOLUME= SINGLE | MIXED | MERGED | SPLITED # Default: SPLITED
# SINGLE: Merged volume mode + No 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_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" ]]
then
set -x
fi
APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
DYNVAR_LIST=""
DYNVAR_LIST="APPL_HOME_DIR"
CONFIG_FILE_LIST=""
version="$1"
@@ -24,72 +50,283 @@ function dynvar_export
#-------------------------------------------------------------------------------
function psfix_cat
{
prefix=$1
separator=$2
suffix=$3
if [[ "${prefix}" == "" ]] || [[ "${suffix}" == "" ]]
then
separator=""
fi
echo "${prefix}${separator}${suffix}"
}
#-------------------------------------------------------------------------------
function module_lib_name_get
{
module=$1
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
echo ${tup/*:}
return
fi
done
echo "${module}"
}
#-------------------------------------------------------------------------------
function docker_service_add
{
varible_prefix="$1"
shift
for var in NAME NAME_FULL URL_PREFIX IMG_NAME VERSION_EXT VERSION_INT PORT_MAIN_EXT PORT_MAIN_INT PORT_ADMIN_EXT PORT_ADMIN_INT USER_NAME GROUP_NAME
for var in service_name target_url_prefix target_name target_name_full target_version from_url_prefix from_name from_version module_name module_version port_main_ext port_main_int port_admin_ext port_admin_int user_name_id group_name_id
do
dynvar_export "${varible_prefix}_${var}" "$1"
eval ${var}=\"${1}\"
shift
done
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_INT}"
# Service variables
dynvar_export "${varible_prefix}_SERVICE_NAME" "${service_name}"
# Global Image variables
if [[ "${target_name}" == "-" ]]
then
target_name="${service_name}"
fi
dynvar_export "${varible_prefix}_IMG_NAME" "${target_name}"
dynvar_export "${varible_prefix}_IMG_NAME_FULL" "${target_name_full}"
dynvar_export "${varible_prefix}_IMG_VERSION" "${target_version}"
dynvar_export "${varible_prefix}_IMG_MAINTAINER" "\${ORG_MAINTAINER}"
dynvar_export "${varible_prefix}_IMG_URL" "${target_url_prefix}/${target_name}:${target_version}"
if [[ "${service_name}" == "${APPL_NAME}" ]]
then
# 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}_HOST_NAME" "$( psfix_cat "${HOST_NAME_PREFIX}" "-" "${service_name}")"
fi
# Building variables
if [[ "${module_name}" == "-" ]]
then
module_name="${target_name}"
fi
if [[ "${target_name_full}" != "-" ]]
then
# Build
dynvar_export "${varible_prefix}_IMG_URL" "\${${varible_prefix}_URL_PREFIX}/\${${varible_prefix}_NAME}:\${${varible_prefix}_VERSION_INT}"
dynvar_export "${varible_prefix}_MODULE_NAME" "${module_name}"
dynvar_export "${varible_prefix}_MODULE_PATH" "src/${module_name}"
dynvar_export "${varible_prefix}_MODULE_VERSION" "${module_version}"
dynvar_export "${varible_prefix}_MODULE_NAME" "\${${varible_prefix}_NAME}"
dynvar_export "${varible_prefix}_MODULE_PATH" "src/\${${varible_prefix}_NAME}"
dynvar_export "${varible_prefix}_IMG_FROM_URL" "${from_url_prefix}/${from_name}:${from_version}"
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}))"
# Volume Directories
if [[ "${APPL_NAME}" != "" ]]
then
dynvar_export "${varible_prefix}_CONTEXT_PATH" "/${APPL_NAME}/${service_name}/"
else
DOCKER_TOOLS_VOLUME="SINGLE"
dynvar_export "${varible_prefix}_CONTEXT_PATH" "/${service_name}/"
fi
if [[ "${DOCKER_TOOLS_VOLUME}" == "" ]]
then
DOCKER_TOOLS_VOLUME="SPLITED"
fi
if [[ "${DOCKER_TOOLS_VOLUME}" != "SPLITED" ]]
then
volume_prefix="."
else
volume_prefix="./mnt/${service_name}"
fi
if [[ "${DOCKER_TOOLS_VOLUME}" == "SINGLE" ]] || [[ "${DOCKER_TOOLS_VOLUME}" == "SPLITED" ]]
then
volume_suffix_initsv_ext=""
volume_suffix_module_ext=""
else
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
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_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_initsv_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}" != "-" ]]
then
dynvar_export "${varible_prefix}_PORT_MAIN_INT" "${port_main_int}"
dynvar_export "${varible_prefix}_PORT_MAIN_EXT" "\$(( ${port_main_ext} + ${PORT_ENV_OFFSET}))"
fi
if [[ "${PORT_SV_INT}" != "" ]]
then
dynvar_export "${varible_prefix}_PORT_SV_INT" "${PORT_SV_INT}"
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}) == "-" ]]
if [[ "${port_admin_int}" != "-" ]]
then
dynvar_export "${varible_prefix}_USER_ID" "-"
dynvar_export "${varible_prefix}_PORT_ADMIN_INT" "${port_admin_int}"
dynvar_export "${varible_prefix}_PORT_ADMIN_EXT" "\$(( ${port_admin_ext} + ${PORT_ENV_OFFSET}))"
fi
# User & Group
if [[ "${user_name_id}" == "-" ]]
then
user_name="-"
user_id="-"
else
if [[ $( eval echo \${${varible_prefix}_USER_NAME}) =~ ^[0-9]+$ ]]
if [[ "${DOCKER_TOOLS_USER_GROUP_FORCE}" == "TRUE" ]]
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
user_name_id=$( id -u)
fi
if [[ $( eval echo \${${varible_prefix}_GROUP_NAME}) == "-" ]]
if [[ "${user_name_id}" =~ ^[0-9]+$ ]]
then
dynvar_export "${varible_prefix}_GROUP_ID" "-"
user_name="-"
user_id="${user_name_id}"
else
if [[ $( eval echo \${${varible_prefix}_GROUP_NAME}) =~ ^[0-9]+$ ]]
user_name="${user_name_id}"
user_id="$( id -u "${user_name}")"
fi
fi
dynvar_export "${varible_prefix}_USER_NAME" "${user_name}"
dynvar_export "${varible_prefix}_USER_ID" "${user_id}"
if [[ "${group_name_id}" == "-" ]]
then
dynvar_export "${varible_prefix}_GROUP_ID" "\${${varible_prefix}_GROUP_NAME}"
group_name="-"
group_id="-"
else
dynvar_export "${varible_prefix}_GROUP_ID" "\$( getent group \${${varible_prefix}_GROUP_NAME} | cut -d: -f3)"
if [[ "${DOCKER_TOOLS_USER_GROUP_FORCE}" == "TRUE" ]]
then
group_name_id=$( id -g)
fi
if [[ "${group_name_id}" =~ ^[0-9]+$ ]]
then
group_name="-"
group_id="${group_name_id}"
else
group_name="${group_name_id}"
group_id="$( getent group "${group_name}" | cut -d: -f3)"
fi
fi
dynvar_export "${varible_prefix}_CONTEXT_PATH" "/${APPL_NAME}/\${${varible_prefix}_NAME}/"
dynvar_export "${varible_prefix}_GROUP_NAME" "${group_name}"
dynvar_export "${varible_prefix}_GROUP_ID" "${group_id}"
}
# dynvar_export "${varible_prefix}_" "${varible_prefix}_${}"
#-------------------------------------------------------------------------------
function docker_config_add
{
config_file_target="$1"
config_file_source="$2"
CONFIG_FILE_LIST+=" ${config_file_target}:${config_file_source}"
}
@@ -110,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
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

28
sbin/docker_network_down Executable file
View File

@@ -0,0 +1,28 @@
#!/bin/bash
#-------------------------------------------------------------------------------
set -o errexit
APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
cd ${APPL_HOME_DIR}
. .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

24
sbin/docker_network_up Executable file
View File

@@ -0,0 +1,24 @@
#!/bin/bash
#-------------------------------------------------------------------------------
set -o errexit
APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
cd ${APPL_HOME_DIR}
. .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

17
sbin/docker_restart Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
#-------------------------------------------------------------------------------
set -o errexit
APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
cd ${APPL_HOME_DIR}
sbin/docker_stop
sbin/docker_start

19
sbin/docker_sbs Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
#-------------------------------------------------------------------------------
set -o errexit
APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
cd ${APPL_HOME_DIR}
sbin/docker_stop
sbin/docker_build_push
sbin/docker_start

View File

@@ -9,7 +9,12 @@ APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
cd ${APPL_HOME_DIR}
sbin/docker_mk_env
docker compose pull
docker compose up -d
sbin/docker_network_up

View File

@@ -9,4 +9,9 @@ APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
#-------------------------------------------------------------------------------
cd ${APPL_HOME_DIR}
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

432
sbin/mk_base_image Executable file
View File

@@ -0,0 +1,432 @@
#!/bin/bash
#-----------------------------------------------------------------------------------------------------------------------------------
#
# Mk Base Image
# Copyright (C) 2026 Arnaud G. GIBERT
# mailto:arnaud@rx3.net
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
#-----------------------------------------------------------------------------------------------------------------------------------
# Includes
#-----------------------------------------------------------------------------------------------------------------------------------
. /usr/lib/rx3/default.bash
set -e
# Global Variable
#-----------------------------------------------------------------------------------------------------------------------------------
VERSION=1.0.0
CONTAINER_NAME="rx3-mageia9"
TMP_DIR_DEF="/tmp/mk_base_image"
ROOT_DIR_DEF="/var/tmp/base_root"
LANG_DEF='en_US.UTF-8'
LANGUAGE_DEF='en_US.UTF-8:en_US:en'
LOCALTIME_DEF='Europe/Paris'
NAME_SERVER_0='10.10.0.254'
NAME_SERVER_1='8.8.8.8'
MIRRORLIST_MGA='http://mirror.xor.rx3/mageia/distrib/9/x86_64 https://mirror.rx3.net/mageia/distrib/9/x86_64 ftp://ftp.proxad.net/mirrors/mageia.org/distrib/9/x86_64 http://distrib-coffee.ipsl.jussieu.fr/pub/linux/Mageia/distrib/9/x86_64'
MIRRORLIST_RX3='http://mirror.xor.rx3/rx3/distrib/9/x86_64 https://mirror.rx3.net/rx3/distrib/9/x86_64'
# Func Exec
#-----------------------------------------------------------------------------------------------------------------------------------
function mbi_func_exec()
{
func="$1"
arg="$2"
name="$3"
if [[ "${direct}" != "true" ]] || [[ "${root_dir}" != "/" ]]
then
err_echo "Only direct ${name} and / Root Dir supported: Recall..."
exec_cmd 'chroot "${root_dir}" '"mk_base_image ${arg} --direct --root / ${RECALL_OPTS}"
else
set +e
# find / 2>/dev/null | grep -v -e "^/dev" -e "^/proc" -e "^/run" -e "^/sys/" >/root/before
declare -f ${func} | sed -n '/^{/,/^}/p' | sed -e '1d;$d' -e 's/;$//' | grep -v -E '^$|^#' | while read -r line
do
exec_cmd "${line}"
done
# find / 2>/dev/null | grep -v -e "^/dev" -e "^/proc" -e "^/run" -e "^/sys/" >/root/after
fi
}
# Version
#-----------------------------------------------------------------------------------------------------------------------------------
function mbi_version_print()
{
echo "MBI Version: [${VERSION}]"
}
# Help
#-----------------------------------------------------------------------------------------------------------------------------------
function mbi_help_print()
{
mbi_version_print
echo "usage: mpm [[-h | --help] | [-V | --version] | [-p | --post] | [-s | --strip] | [-u | --unstrip]] [-d | --direct] [-l | --lang <Lang>] [-L | --language <Langage>] [-m | --localtime <Local_Time>] [-r | --root <Root_Dir>] [-t | --tmp <Tmp_Dir>] [-T | --test] [-v | --verbose]"
}
# Arg Parse
#-----------------------------------------------------------------------------------------------------------------------------------
function mbi_args_parse()
{
mode="default"
verbose="false"
dry_run="false"
direct="false"
tmp_args=$(getopt -o dhl:L:m:pr:Tt:suvV --long direct,help,lang:,language:,localtime:,post,root:,test,tmp:,strip,unstrip,verbose,version -- "$@")
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$tmp_args': they are essential!
eval set -- "${tmp_args}"
while true ; do
case "$1" in
# Options
-d|--direct) direct="true"; shift;;
# Locale options
-l|--lang) shift; lang="$1"; shift; RECALL_OPTS+=" --lang ${lang}";;
-L|--language) shift; language="$1"; shift; RECALL_OPTS+=" --language ${language}";;
-m|--localtime) shift; localtime="$1"; shift; RECALL_OPTS+=" --localtime ${localtime}";;
# Path options
-t|--tmp) shift; tmp_dir="$1"; shift;;
-r|--root) shift; root_dir="$1"; shift;;
# Mode switches
-h|--help) mode="exit"; mbi_help_print; shift;;
-s|--post) mode="post"; shift;;
-s|--strip) mode="strip"; shift;;
-u|--unstrip) mode="unstrip"; shift;;
-V|--version) mode="exit"; mbi_version_print; shift;;
# Global options
-T|--test) dry_run="true"; shift;;
-v|--verbose) verbose="true"; shift; RECALL_OPTS+=" --verbose";;
#
--) shift; break;;
*) echo "args_parse internal error [$1] !"; exit 1;;
esac
done
}
# Env Init
#-----------------------------------------------------------------------------------------------------------------------------------
function mbi_env_init()
{
root_clean="$1"
if [[ -d "${tmp_dir}" ]]
then
err_echo "Removing Tmp Dir: [${tmp_dir}] content..."
exec_cmd "echo rm -R \"${tmp_dir}/*\""
else
err_echo "Creating Tmp Dir: [${tmp_dir}]..."
exec_cmd "mkdir -p \"${tmp_dir}\""
fi
if [[ "${direct}" == "true" ]]
then
if [[ -d "${root_dir}" ]]
then
if [[ "${root_clean}" == "true" ]]
then
err_echo "Removing Root Dir: [${root_dir}] content..."
exec_cmd "echo rm -R \"${root_dir}/*\""
else
err_echo "Keeping Root Dir content..."
fi
else
if [[ "${root_clean}" == "true" ]]
then
err_echo "Creating Root Dir: [${root_dir}]..."
exec_cmd "mkdir -p \"${root_dir}\""
else
err_echo "Error: Root Dir: [${root_dir}] not found!"
exit 1
fi
fi
else
if [[ "${root_clean}" == "true" ]]
then
if [[ $( buildah ls | grep ${CONTAINER_NAME}) != "" ]]
then
exec_cmd "buildah rm \"${CONTAINER_NAME}\" >/dev/null"
fi
exec_cmd "buildah from --name \"${CONTAINER_NAME}\" scratch >/dev/null"
exec_cmd "buildah config --label maintainer=\"Arnaud G. GIBERT <arnaud@rx3.net>\" \"${CONTAINER_NAME}\""
else
if [[ $( buildah ls | grep ${CONTAINER_NAME}) == "" ]]
then
echo_err "buildah container: [${CONTAINER_NAME}] not found!"
exit 1
fi
fi
if [[ "$BUILDAH_ISOLATION" != "rootless" ]]
then
err_echo "Unsharing..."
exec_cmd 'buildah unshare "$0" "${orig_args[@]}"'
exit $?
fi
root_dir=$(buildah mount ${CONTAINER_NAME})
fi
}
# Base Install Pre
#-----------------------------------------------------------------------------------------------------------------------------------
function mbi_base_install_pre()
{
exec_cmd 'urpmi --root ${root_dir} --force --no-install --no-recommends --nolock --reinstall --download-all ${tmp_dir} --downloader curl makedev filesystem curl urpmi rx3-base docker_tools-devel'
exec_cmd 'rpm --root ${root_dir} --initdb'
exec_cmd 'rpm --root ${root_dir} -Uvh --nodeps --noscripts ${tmp_dir}/rpms/filesystem*'
exec_cmd 'rm ${tmp_dir}/rpms/filesystem*'
exec_cmd 'rpm --root ${root_dir} -Uvh --nodeps --noscripts ${tmp_dir}/rpms/makedev*'
exec_cmd 'rm ${tmp_dir}/rpms/makedev*'
exec_cmd 'rpm --root ${root_dir} -Uvh --nodeps ${tmp_dir}/rpms/*'
exec_cmd 'rm -R ${tmp_dir}'
# Enable Neworking
exec_cmd 'echo -e "nameserver ${NAME_SERVER_0}\nnameserver ${NAME_SERVER_1}" >"${root_dir}/etc/resolv.conf"'
exec_cmd 'echo -e "NETWORKING=yes" >"${root_dir}/etc/sysconfig/network"'
}
# Base Install Post
#-----------------------------------------------------------------------------------------------------------------------------------
function _mbi_base_install_post()
{
urpmi.addmedia --distrib --mirrorlist "${MIRRORLIST_MGA}"
urpmi.addmedia --distrib --mirrorlist "${MIRRORLIST_RX3}"
urpmi.update -a
urpmi --force basesystem-minimal locales locales-en shared-mime-info vim-minimal mpm
echo -e "LANG=${lang}\nLANGUAGE=${language}" >"${root_dir}/etc/locale.conf"
ln -s /usr/share/zoneinfo/${localtime} "${root_dir}/etc/localtime"
urpmi --force --auto-update
}
function mbi_base_install_post()
{
mbi_func_exec "_mbi_base_install_post" "--post" "post-installing"
}
# Base Strip
#-----------------------------------------------------------------------------------------------------------------------------------
function _mbi_base_strip()
{
# RPM force uninstall
rpm -e --nodeps cracklib-dicts buildah
rpm -e dhcp-common dhcp-client cronie-anacron opencontainers-runc lib64gpgme11 gnupg2 lib64ksba8 lib64usb1.0_0 lib64npth0 lib64assuan0
# Docker mounts tmpfs at /dev and procfs at /proc so we can remove them
rm -rf /dev /proc 2>/tmp/null
mkdir -p /dev /proc 2>/tmp/null
# Keep only en_US.UTF8 locale
rm -rf /usr/share/locale/!("en_US.UTF-8"|"locale.alias"|"locale-archive")
rm -rf /usr/{{lib,lib64}/gconv,bin/localedef,sbin/build-locale-archive}
# Docs
rm -rf /usr/share/{man,doc,info,gnome/help}
# sln
rm -rf /sbin/sln
# ldconfig
rm -rf /etc/ld.so.cache /var/cache/ldconfig
mkdir -p --mode=0755 /var/cache/ldconfig
# UDev
rm -rf /usr/lib/udev
rm -rf /etc/udev/hwdb.bin
rm -rf /usr/lib/.build-id
# Cache & Tmp
rm -rf /var/cache/urpmi/rpms 2>/tmp/null
rm -rf /tmp/*
}
function mbi_base_strip()
{
mbi_func_exec "_mbi_base_strip" "--strip" "stripping"
}
# Base UnStrip
#-----------------------------------------------------------------------------------------------------------------------------------
function _mbi_base_unstrip()
{
urpmi.update -a
# Install uninstalled packages
urpmi --force cracklib-dicts buildah dhcp-common dhcp-client cronie-anacron buildah opencontainers-runc lib64gpgme11 gnupg2 lib64ksba8 lib64usb1.0_0 lib64npth0 lib64assuan0
# Force reinstall all packages
urpmi --force --replacepkgs $(rpm -qa | grep -v gpg-pubkey)
}
function mbi_base_unstrip()
{
mbi_func_exec "_mbi_base_unstrip" "--unstrip" "unstripping"
}
# Main
#-----------------------------------------------------------------------------------------------------------------------------------
orig_args=("$@")
root_dir="${ROOT_DIR_DEF}"
tmp_dir="${TMP_DIR_DEF}"
lang="${LANG_DEF}"
language="${LANGUAGE_DEF}"
localtime="${LOCALTIME_DEF}"
for var in $(env | grep -e LC_ -e LANG); do unset ${var/=*/}; done
export LC_ALL="C"
mbi_args_parse "$@"
if [[ ${mode} == "exit" ]]
then
exit 0
fi
if [[ "${mode}" == "default" ]]
then
mbi_env_init "true"
else
mbi_env_init "false"
fi
err_echo "MBI: Mode: [${mode}] Verbose: [${verbose}] Direct: [${direct}] Dry_Run: [${dry_run}] Root_Dir: [${root_dir}] Tmp_Dir: [${tmp_dir}] Lang: [${lang}] Language: [${language}] Local_Time: [${localtime}]"
case "${mode}" in
"default")
mbi_base_install_pre
mbi_base_install_post
mbi_base_strip
;;
"post")
mbi_base_install_post
;;
"strip")
mbi_base_strip
;;
"unstrip")
mbi_base_unstrip
;;
esac