[fix]增加net管理脚本;更新Makefile中变量公式

This commit is contained in:
2020-12-14 17:10:13 +08:00
parent 2df379f02a
commit 658eb98b7d
12 changed files with 291 additions and 37 deletions
+3 -3
View File
@@ -3,7 +3,7 @@
FROM debian:buster-slim
# APT源配置:default / tencent / ustc / aliyun / huawei
ARG apt_source=tencent
ARG apt_source=aliyun
ENV APP_NAME=dbuilder \
APP_USER=builder
@@ -39,8 +39,8 @@ RUN select_source ${apt_source}
# patch perl perl-modules-5.28 pinentry-curses pkg-config procps python3
# python3-minimal python3.7 python3.7-minimal readline-common sudo wget
# xz-utils
RUN install_pkg sudo wget curl git ca-certificates iproute2 net-tools nano \
dpkg gnupg dirmngr apt-utils apt-transport-https lsb-release iputils-ping \
RUN install_pkg sudo wget curl git ca-certificates iproute2 net-tools nano dpkg gnupg \
dirmngr apt-utils apt-transport-https lsb-release iputils-ping \
build-essential cmake libcmocka-dev pkg-config libssl-dev
RUN prepare_env && create_user
+2 -2
View File
@@ -17,7 +17,7 @@ current_tag:=$(shell if [ ! `git status >/dev/null 2>&1` ]; then git rev-parse -
build-arg:=--build-arg apt_source=aliyun
# 设置本地下载服务器路径,加速调试时的本地编译速度
local_ip:=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $$2}'|tr -d "addr:"`
local_ip:=`echo "en0 eth0" |xargs -n1 ip addr show 2>/dev/null|grep inet|grep -v 127.0.0.1|grep -v inet6|tr "/" " "|awk '{print $$2}'`
build-arg+=--build-arg local_url=http://$(local_ip)/dist-files
.PHONY: build clean clearclean upgrade tag push
@@ -32,7 +32,6 @@ build:
@echo "Add tag: $(alpine_name):latest"
@docker tag "$(alpine_name):$(current_tag)" $(alpine_name):latest
# 清理悬空的镜像(无TAG)及停止的容器
# 清理悬空的镜像(无TAG)及停止的容器
clearclean: clean
@echo "Clean untaged images and stoped containers..."
@@ -65,3 +64,4 @@ push: tag
upgrade:
@echo "Upgrade all images..."
@docker images | grep 'colovu' | grep -v '<none>' | grep -v "latest-" | awk '{print $$1":"$$2}' | sort -u | xargs -L 1 docker pull
+21 -12
View File
@@ -7,7 +7,7 @@
其中:
- dbuilder:基于 Debian 系统的 Builder 环境
- abuilder:基于 Alpine 系统的 Builder环境
- abuilder:基于 Alpine 系统的 Builder 环境
**版本信息:**
@@ -16,8 +16,9 @@
**镜像信息:**
* 镜像地址:
* colovu/dbuilder:latest
* colovu/abuilder:latest
* registry.cn-shenzhen.aliyuncs.com/colovu/dbuilder:latest
* registry.cn-shenzhen.aliyuncs.com/colovu/abuilder:latest
## 数据卷
@@ -25,7 +26,7 @@
```shell
/srv/data # 工作目录
/srv/conf # 配置文件目录
/srv/conf # 配置文件目录
```
## 用户
@@ -39,8 +40,8 @@
使用`--from=0`方式:
```dockerfile
# 预编译阶段
FROM colovu/abuilder
# 预编译阶段 ===============================
FROM registry.cn-shenzhen.aliyuncs.com/colovu/abuilder
WORKDIR /build
RUN \
@@ -49,7 +50,9 @@ RUN \
wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/${gosu_ver}/gosu-$dpkgArch"; \
chmod +x /usr/local/bin/gosu;
# 镜像生成阶段
# ... 省略
# 镜像生成阶段 ==============================
FROM scratch
# 从编译阶段的中拷贝编译结果到当前镜像中
COPY --from=0 /usr/local/bin/gosu /usr/local/bin/
@@ -59,12 +62,19 @@ CMD []
使用`--from=name`方式:
```dockerfile
# 预编译阶段。命名为`builder`
FROM colovu/abuilder as builder
# 预编译阶段。命名为`builder` ==================
FROM registry.cn-shenzhen.aliyuncs.com/colovu/abuilder as builder
WORKDIR /build
RUN \
dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
gosu_ver=1.12; \
wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/${gosu_ver}/gosu-$dpkgArch"; \
chmod +x /usr/local/bin/gosu;
# ... 省略
# 镜像生成阶段
# 镜像生成阶段 ==============================
FROM scratch
# 从编译阶段的中拷贝编译结果到当前镜像中
COPY --from=builder /usr/local/bin/gosu /usr/local/bin/
@@ -74,8 +84,7 @@ CMD []
使用该方式的优势:
- 因系统相关软件包已更新,工具已经预先安装,不需要在每次编译镜像时耗费大量时间在类似重复工作上
- 不用安装、删除临时软件,方式生成多余的垃圾文件;预编译阶段的内容使用完即丢弃,不会对镜像大小产生影响
- 不用安装、删除临时软件,放置生成多余的垃圾文件;预编译阶段的内容使用完即丢弃,不会对镜像大小产生影响
+9 -8
View File
@@ -1,28 +1,29 @@
# Ver: 1.0 by Endial Fang (endial@126.com)
# Ver: 1.2 by Endial Fang (endial@126.com)
#
FROM alpine:3.12
# 说明:
# 虽然原始镜像包含 wget, 但该版本存在问题,下载部分资源(如redis)会报错,因此安装官方完整版
# APK源配置:default / tencent / ustc / aliyun / huawei
ARG apt_source=tencent
ARG apt_source=aliyun
ENV APP_NAME=abuilder \
APP_USER=builder
LABEL \
"Version"="v3.12" \
"Description"="Docker image for Builder based on Alpine." \
"Description"="Docker image for Builder based on Alpine v3.12." \
"Dockerfile"="https://github.com/colovu/docker-builder" \
"Vendor"="Endial Fang (endial@126.com)"
COPY prebuilds /
COPY customer /
RUN select_source ${apt_source}
RUN install_pkg sudo wget git curl ca-certificates iproute2 net-tools nano \
dpkg dpkg-dev gnupg bash build-base cmake pkgconf \
# 说明:
# 虽然原始镜像包含 wget, 但该版本存在问题,下载部分资源(如redis)会报错,因此安装官方完整版
RUN install_pkg sudo wget curl git ca-certificates iproute2 net-tools nano dpkg gnupg \
dpkg-dev bash build-base cmake pkgconf \
linux-headers cmocka-dev openssl-dev
RUN prepare_env && create_user
CMD []
@@ -35,8 +35,8 @@ print_command_help() {
local arg
for arg; do
case "$arg" in
-'?'|--help|-V|--version)
exec "${APP_EXEC:-/bin/bash}" "${arg}"
-'?'|--help|-V|--version|-version)
exec "$@"
exit
;;
esac
@@ -1,5 +1,7 @@
#!/bin/bash
# Ver: 1.1 by Endial Fang (endial@126.com)
#
# 日志输出函数库
#[[ ${ENV_DEBUG:-false} = true ]] && set -x
MODULE="$(basename "$0")"
@@ -0,0 +1,120 @@
#!/bin/bash
# Ver: 1.1 by Endial Fang (endial@126.com)
#
# 文件管理函数库
# 加载依赖项
. /usr/local/scripts/liblog.sh # 日志输出函数库
# 函数列表
# 域名解析
# 参数:
# $1 - 需要解析的主机名
dns_lookup() {
local host="${1:?host is missing}"
getent ahosts "$host" | awk '/STREAM/ {print $1 }'
}
# 尝试解析域名并返回对应的 IP
# 参数:
# $1 - 主机名
# $2 - 尝试次数
# $3 - 重试间隔时间(秒)
wait_for_dns_lookup() {
local hostname="${1:?hostname is missing}"
local retries="${2:-5}"
local seconds="${3:-1}"
check_host() {
if [[ $(dns_lookup "$hostname") == "" ]]; then
false
else
true
fi
}
# Wait for the host to be ready
retry_while "check_host ${hostname}" "$retries" "$seconds"
dns_lookup "$hostname"
}
# 获取当前主机 IP
get_machine_ip() {
local -a ip_addresses
local hostname
hostname="$(hostname)"
read -r -a ip_addresses <<< "$(dns_lookup "$hostname" | xargs echo)"
if [[ "${#ip_addresses[@]}" -gt 1 ]]; then
LOG_W "Found more than one IP address associated to hostname ${hostname}: ${ip_addresses[*]}, will use ${ip_addresses[0]}"
elif [[ "${#ip_addresses[@]}" -lt 1 ]]; then
LOG_E "Could not find any IP address associated to hostname ${hostname}"
exit 1
fi
echo "${ip_addresses[0]}"
}
# Check if the provided argument is a resolved hostname
# 参数:
# $1 - 待检测的主机名
# 返回值:
# 布尔值
is_hostname_resolved() {
local -r host="${1:?missing value}"
if [[ -n "$(dns_lookup "$host")" ]]; then
true
else
false
fi
}
# 解析 URL
# 参数:
# $1 - URI 字符串
# $2 - 类型字符串. 有效值 (scheme, authority, userinfo, host, port, path, query or fragment)
# 返回值:
# 字符串
parse_uri() {
local uri="${1:?uri is missing}"
local component="${2:?component is missing}"
# Solution based on https://tools.ietf.org/html/rfc3986#appendix-B with
# additional sub-expressions to split authority into userinfo, host and port
# Credits to Patryk Obara (see https://stackoverflow.com/a/45977232/6694969)
local -r URI_REGEX='^(([^:/?#]+):)?(//((([^@/?#]+)@)?([^:/?#]+)(:([0-9]+))?))?(/([^?#]*))?(\?([^#]*))?(#(.*))?'
# || | ||| | | | | | | | | |
# |2 scheme | ||6 userinfo 7 host | 9 port | 11 rpath | 13 query | 15 fragment
# 1 scheme: | |5 userinfo@ 8 :... 10 path 12 ?... 14 #...
# | 4 authority
# 3 //...
local index=0
case "$component" in
scheme)
index=2
;;
authority)
index=4
;;
userinfo)
index=6
;;
host)
index=7
;;
port)
index=9
;;
path)
index=10
;;
query)
index=13
;;
fragment)
index=14
;;
*)
stderr_print "unrecognized component $component"
return 1
;;
esac
[[ "$uri" =~ $URI_REGEX ]] && echo "${BASH_REMATCH[${index}]}"
}
+5 -5
View File
@@ -1,5 +1,5 @@
#!/bin/bash
# Ver: 1.0 by Endial Fang (endial@126.com)
# Ver: 1.1 by Endial Fang (endial@126.com)
#
# shell 执行参数,分别为 -e(命令执行错误则退出脚本) -u(变量未定义则报错) -x(打印实际待执行的命令行)
set -eux
@@ -141,12 +141,12 @@ fi
# 安装或解压软件
case "$1" in
download)
LOG_I "Download success: $CACHE_ROOT/$PACKAGE"
;;
download)
LOG_I "Download success: $CACHE_ROOT/$PACKAGE"
;;
install)
LOG_I "Installing $PACKAGE"
cp $CACHE_ROOT/$PACKAGE /usr/local/bin/
cp $CACHE_ROOT/$PACKAGE /usr/local/bin/
;;
unpack)
if ! tar -taf $CACHE_ROOT/$PACKAGE >/dev/null 2>&1; then
+2 -2
View File
@@ -35,8 +35,8 @@ print_command_help() {
local arg
for arg; do
case "$arg" in
-'?'|--help|-V|--version)
exec "${APP_EXEC:-/bin/bash}" "${arg}"
-'?'|--help|-V|--version|-version)
exec "$@"
exit
;;
esac
+2
View File
@@ -1,5 +1,7 @@
#!/bin/bash
# Ver: 1.1 by Endial Fang (endial@126.com)
#
# 日志输出函数库
#[[ ${ENV_DEBUG:-false} = true ]] && set -x
MODULE="$(basename "$0")"
+120
View File
@@ -0,0 +1,120 @@
#!/bin/bash
# Ver: 1.1 by Endial Fang (endial@126.com)
#
# 文件管理函数库
# 加载依赖项
. /usr/local/scripts/liblog.sh # 日志输出函数库
# 函数列表
# 域名解析
# 参数:
# $1 - 需要解析的主机名
dns_lookup() {
local host="${1:?host is missing}"
getent ahosts "$host" | awk '/STREAM/ {print $1 }'
}
# 尝试解析域名并返回对应的 IP
# 参数:
# $1 - 主机名
# $2 - 尝试次数
# $3 - 重试间隔时间(秒)
wait_for_dns_lookup() {
local hostname="${1:?hostname is missing}"
local retries="${2:-5}"
local seconds="${3:-1}"
check_host() {
if [[ $(dns_lookup "$hostname") == "" ]]; then
false
else
true
fi
}
# Wait for the host to be ready
retry_while "check_host ${hostname}" "$retries" "$seconds"
dns_lookup "$hostname"
}
# 获取当前主机 IP
get_machine_ip() {
local -a ip_addresses
local hostname
hostname="$(hostname)"
read -r -a ip_addresses <<< "$(dns_lookup "$hostname" | xargs echo)"
if [[ "${#ip_addresses[@]}" -gt 1 ]]; then
LOG_W "Found more than one IP address associated to hostname ${hostname}: ${ip_addresses[*]}, will use ${ip_addresses[0]}"
elif [[ "${#ip_addresses[@]}" -lt 1 ]]; then
LOG_E "Could not find any IP address associated to hostname ${hostname}"
exit 1
fi
echo "${ip_addresses[0]}"
}
# Check if the provided argument is a resolved hostname
# 参数:
# $1 - 待检测的主机名
# 返回值:
# 布尔值
is_hostname_resolved() {
local -r host="${1:?missing value}"
if [[ -n "$(dns_lookup "$host")" ]]; then
true
else
false
fi
}
# 解析 URL
# 参数:
# $1 - URI 字符串
# $2 - 类型字符串. 有效值 (scheme, authority, userinfo, host, port, path, query or fragment)
# 返回值:
# 字符串
parse_uri() {
local uri="${1:?uri is missing}"
local component="${2:?component is missing}"
# Solution based on https://tools.ietf.org/html/rfc3986#appendix-B with
# additional sub-expressions to split authority into userinfo, host and port
# Credits to Patryk Obara (see https://stackoverflow.com/a/45977232/6694969)
local -r URI_REGEX='^(([^:/?#]+):)?(//((([^@/?#]+)@)?([^:/?#]+)(:([0-9]+))?))?(/([^?#]*))?(\?([^#]*))?(#(.*))?'
# || | ||| | | | | | | | | |
# |2 scheme | ||6 userinfo 7 host | 9 port | 11 rpath | 13 query | 15 fragment
# 1 scheme: | |5 userinfo@ 8 :... 10 path 12 ?... 14 #...
# | 4 authority
# 3 //...
local index=0
case "$component" in
scheme)
index=2
;;
authority)
index=4
;;
userinfo)
index=6
;;
host)
index=7
;;
port)
index=9
;;
path)
index=10
;;
query)
index=13
;;
fragment)
index=14
;;
*)
stderr_print "unrecognized component $component"
return 1
;;
esac
[[ "$uri" =~ $URI_REGEX ]] && echo "${BASH_REMATCH[${index}]}"
}
+3 -3
View File
@@ -141,9 +141,9 @@ fi
# 安装或解压软件
case "$1" in
download)
LOG_I "Download success: $CACHE_ROOT/$PACKAGE"
;;
download)
LOG_I "Download success: $CACHE_ROOT/$PACKAGE"
;;
install)
LOG_I "Installing $PACKAGE"
cp $CACHE_ROOT/$PACKAGE /usr/local/bin/