This commit is contained in:
2022-04-18 11:21:20 +08:00
commit 45a7af638f
210 changed files with 8997 additions and 0 deletions

218
mysql/ADD/ccmd Executable file
View File

@@ -0,0 +1,218 @@
#!/bin/bash
##################################################
# EVN #
# - SERVER_ID #
# - GROUP_REPLICATION #
# - GROUP_REPLICATION_LOCAL_ADDRESS #
# - GROUP_REPLICATION_GROUP_SEEDS #
# - EXTRA_SCRIPTS #
# Mount file #
# - /etc/my.cnf #
# Mount dir #
# - LOG_DIR #
# - DATA_DIR #
# - BINLOG_DIR #
##################################################
set -euo pipefail
export LANG=en_US.UTF-8
trap Quit EXIT
PIDS=
GOT_SIGTERM=
LOG_DIR='/var/log/mysql'
DATA_DIR='/var/lib/mysql'
BINLOG_DIR='/var/lib/mysql-bin'
SOCK_FILE='/run/mysqld/mysqld.sock'
PID_FILE='/run/mysqld/mysqld.pid'
INIT_FLAG=
GROUP_REPLICATION="${GROUP_REPLICATION:+1}"
EXTRA_SCRIPTS="${EXTRA_SCRIPTS:+1}"
if [ -n "$GROUP_REPLICATION" ]; then
SERVER_ID=${SERVER_ID:?}
GROUP_REPILCATION_GROUP_NAME="${GROUP_REPILCATION_GROUP_NAME:-aaaabbbb-7777-8888-9999-ccccddddeeee}"
GROUP_REPLICATION_LOCAL_ADDRESS="${GROUP_REPLICATION_LOCAL_ADDRESS}"
GROUP_REPLICATION_GROUP_SEEDS="${GROUP_REPLICATION_GROUP_SEEDS}"
BOOTSTRAP_GROUP=1
fi
function Print {
local file=/dev/null
[ '-f' = "$1" ] && file=$2 && shift && shift
date +"[%F %T] $*" | tee -a $file
}
function Quit {
Print killing mysqld ...
mysqladmin shutdown || true
while :; do
pkill -f mysqld && Print killing mysqld ... || break
sleep 1
done
Print Container stopped.
test -n "$GOT_SIGTERM"
}
function ProbeSeeds {
local all_seeds=" ${GROUP_REPLICATION_GROUP_SEEDS//,/ } "
local other_seeds="${all_seeds/ $GROUP_REPLICATION_LOCAL_ADDRESS / }"
local seed= seed_return=0
[ "$all_seeds" = "$other_seeds" ] \
&& Print Not found local_address in group_seeds! \
&& exit 1
Print Probe connection to other seeds ...
for seed in $other_seeds; do
echo -n "Connecting $seed ... "
curl -s --connect-timeout 8 ftp://$seed || seed_return=$?
[ 6 = "$seed_return" ] && echo failed to resolve host:"${seed%:*}"! && exit 1
[ 7 = "$seed_return" ] && echo offline. && continue
echo online.
BOOTSTRAP_GROUP=
break
done
}
function Init {
rm -f ${SOCK_FILE}* ${PID_FILE}
chown -R mysql.mysql $LOG_DIR $BINLOG_DIR $DATA_DIR
if [ ! -d "$DATA_DIR/mysql" ]; then
Print Write essential server config to /etc/mysql/my.cnf ...
Print Init mysql db files ...
mysqld_pre_systemd
INIT_FLAG=1
fi
}
function InitGroupReplication {
if ! grep -i '^group[-_]replication' /etc/my.cnf; then
Print Write advisable group replication config to /etc/my.cnf ...
grep -i '^binlog[-_]expire[-_]logs[-_]seconds' /etc/my.cnf \
|| echo 'binlog-expire-logs-seconds = 172800' >> /etc/my.cnf
echo 'group-replication-consistency = BEFORE_ON_PRIMARY_FAILOVER
group-replication-member-expel-timeout = 2
group-replication-unreachable-majority-timeout = 2
group-replication-autorejoin-tries = 0
group-replication-exit-state-action = OFFLINE_MODE
' >> /etc/my.cnf
fi
if ! grep -i '^group[-_]replication' /etc/mysql/my.cnf; then
Print Write essential group replication config to /etc/mysql/my.cnf ...
cat >> /etc/mysql/my.cnf <<-EOF
server-id = $SERVER_ID
gtid-mode = ON
enforce-gtid-consistency = TRUE
binlog-format = ROW
binlog-checksum = NONE
log-bin = /var/lib/mysql-bin/master
relay-log = /var/lib/mysql-bin/slave
log-slave-updates = TRUE
relay-log-recovery = TRUE
slave-parallel-type = LOGICAL_CLOCK
slave-preserve-commit-order = ON
disabled-storage-engines = "MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
plugin-load-add = "group_replication.so;mysql_clone.so"
group-replication-group-name = "$GROUP_REPILCATION_GROUP_NAME"
group-replication-local-address = "$GROUP_REPLICATION_LOCAL_ADDRESS"
group-replication-group-seeds = "$GROUP_REPLICATION_GROUP_SEEDS"
group-replication-bootstrap-group = OFF
group-replication-start-on-boot = OFF
EOF
fi
}
function ImportInitSql {
local sql_file= sql_files=
mysql -e "CREATE USER docker@localhost IDENTIFIED BY 'China_19\$(10)!'"
mysql -e "GRANT SHUTDOWN ON *.* TO docker@localhost"
if sql_files="$(ls $LOG_DIR/init_sql/*.sql 2>/dev/null)"; then
Print Import the sql files ...
for sql_file in $sql_files; do
Print Importing $sql_file ...
mysql < $sql_file
done
Print Imported all sql files successfully.
fi
}
function StartGroupReplication {
if [ -n "$BOOTSTRAP_GROUP" ]; then
Print Bootstrap new group replication ...
mysql -e "
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
"
else
Print Join a running group replication ...
mysql -e "START GROUP_REPLICATION;"
fi
}
function CreateGroupReplicationChannel {
Print Create user and channel of group replication ...
mysql -e "SET SQL_LOG_BIN=0;
CREATE USER rpl@'%' IDENTIFIED BY 'Rpl_1234';
GRANT REPLICATION SLAVE ON *.* TO rpl@'%';
GRANT BACKUP_ADMIN ON *.* TO rpl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO
MASTER_USER='rpl',
MASTER_PASSWORD='Rpl_1234'
FOR CHANNEL 'group_replication_recovery';
"
}
function StartExtraScripts {
Print Start extra scripts ...
while sleep 2; do
for script in $(find $LOG_DIR/extra_scripts/ -type f -executable \
2>/dev/null || true); do
$script &
done
done &
}
function StartProc {
Print Start mysql ...
mysqld -u mysql &
PIDS="$PIDS $!"
while sleep 1; do
[ -e $SOCK_FILE ] && break || echo -n .
[ ! -e /proc/$! ] && echo && Print unexpected error! && exit
done
echo
if [ -n "$INIT_FLAG" ]; then
ImportInitSql
if [ -n "$GROUP_REPLICATION" ]; then
CreateGroupReplicationChannel
fi
fi
if [ -n "$GROUP_REPLICATION" ]; then
StartGroupReplication
fi
if [ -n "$EXTRA_SCRIPTS" ]; then
StartExtraScripts
fi
Print MySQL is ready for connections.
}
function Main {
local pid=
[ -n "$GROUP_REPLICATION" ] && ProbeSeeds
Init
[ -n "$GROUP_REPLICATION" ] && InitGroupReplication
StartProc
trap "GOT_SIGTERM=1; Print Got SIGTERM ..." SIGTERM
while [ -z "$GOT_SIGTERM" ] && sleep 1; do
for pid in $PIDS; do
[ ! -e /proc/$pid ] && Print Unexpected error! && exit
done
done
}
# Start here
Main

36
mysql/Demo/MGR/README.md Normal file
View File

@@ -0,0 +1,36 @@
# 部署 MySQL Group Replication
- 按实际环境修改
- docker-compose.yml
- mysql{1..3}/my.cnf
- 创建目录
```
grep '\<source:' docker-compose.yml | cut -d: -f2 | xargs mkdir -p
```
- 启动 mysql1
```
docker-compose up -d mysql1
```
- 查看 mysql1 容器日志,直至出现 "MySQL is ready for connections." 字样
```
docker-compose logs -f mysql1
```
- 启动 mysql2 和 mysql3
```
docker-compose up -d
```
- 查看 mysql2 容器日志,直至出现 "MySQL is ready for connections." 字样
```
docker-compose logs -f mysql2
```
- 查看 mysql3 容器日志,直至出现 "MySQL is ready for connections." 字样
```
docker-compose logs -f mysql3
```

View File

@@ -0,0 +1,90 @@
version: "3.7"
services:
mysql1:
image: harbor.colben.cn/general/mysql:8
container_name: mysql1
restart: "no"
stop_grace_period: 5m
environment:
GROUP_REPLICATION: 1
SERVER_ID: 11
GROUP_REPLICATION_LOCAL_ADDRESS: "192.168.111.11:3306"
GROUP_REPLICATION_GROUP_SEEDS: "192.168.111.11:3306,192.168.111.22:3306,192.168.111.33:3306"
networks:
mysql_replication:
ipv4_address: 192.168.111.11
volumes:
- type: bind
source: ./mysql1/my.cnf
target: /etc/my.cnf
- type: bind
source: ./mysql1/db
target: /var/lib/mysql
- type: bind
source: ./mysql1/binlog
target: /var/lib/mysql-bin
- type: bind
source: ./mysql1/log
target: /var/log/mysql
mysql2:
image: harbor.colben.cn/general/mysql:8
container_name: mysql2
restart: "no"
stop_grace_period: 5m
environment:
GROUP_REPLICATION: 1
SERVER_ID: 22
GROUP_REPLICATION_LOCAL_ADDRESS: "192.168.111.22:3306"
GROUP_REPLICATION_GROUP_SEEDS: "192.168.111.11:3306,192.168.111.22:3306,192.168.111.33:3306"
networks:
mysql_replication:
ipv4_address: 192.168.111.22
volumes:
- type: bind
source: ./mysql2/my.cnf
target: /etc/my.cnf
- type: bind
source: ./mysql2/db
target: /var/lib/mysql
- type: bind
source: ./mysql2/binlog
target: /var/lib/mysql-bin
- type: bind
source: ./mysql2/log
target: /var/log/mysql
mysql3:
image: harbor.colben.cn/general/mysql:8
container_name: mysql3
restart: "no"
stop_grace_period: 5m
environment:
GROUP_REPLICATION: 1
SERVER_ID: 33
GROUP_REPLICATION_LOCAL_ADDRESS: "192.168.111.33:3306"
GROUP_REPLICATION_GROUP_SEEDS: "192.168.111.11:3306,192.168.111.22:3306,192.168.111.33:3306"
networks:
mysql_replication:
ipv4_address: 192.168.111.33
volumes:
- type: bind
source: ./mysql3/my.cnf
target: /etc/my.cnf
- type: bind
source: ./mysql3/db
target: /var/lib/mysql
- type: bind
source: ./mysql3/binlog
target: /var/lib/mysql-bin
- type: bind
source: ./mysql3/log
target: /var/log/mysql
networks:
mysql_replication:
ipam:
config:
- subnet: "192.168.111.0/24"

View File

@@ -0,0 +1,3 @@
[mysqld]
mysqlx = OFF

View File

@@ -0,0 +1,3 @@
[mysqld]
mysqlx = OFF

View File

@@ -0,0 +1,3 @@
[mysqld]
mysqlx = OFF

View File

@@ -0,0 +1,21 @@
# 部署 MySQL 单节点
- 按实际环境修改
- docker-compose.yml
- mysql/my.cnf
- 创建目录
```
grep '\<source:' docker-compose.yml | cut -d: -f2 | xargs mkdir -p
```
- 启动
```
docker-compose up -d
```
- 查看日志,直至出现 "MySQL is ready for connections."
```
docker-compose logs mysql
```

View File

@@ -0,0 +1,27 @@
version: "3.7"
services:
mysql:
image: harbor.colben.cn/general/mysql:8
container_name: mysql
restart: "on-failure"
stop_grace_period: 5m
privileged: true
networks:
mysql:
ports:
- 3306:3306
volumes:
- type: bind
source: ./mysql/my.cnf
target: /etc/my.cnf
- type: bind
source: ./mysql/binlog
target: /var/lib/mysql-bin
- type: bind
source: ./mysql/db
target: /var/lib/mysql
- type: bind
source: ./mysql/log
target: /var/log/mysql

View File

@@ -0,0 +1,19 @@
[mysqld]
mysqlx = OFF
skip-name-resolve = 1
max-user-connections = 600
## this should be less than 80% of total memory
innodb-buffer-pool-size = xxxxG
## this should be half of "innodb-buffer-pool-size"
innodb-buffer-pool-instances = xxxx
# binlog
server-id = 1
log-bin = /var/lib/mysql-bin/master
binlog-format = ROW
binlog-expire-logs-seconds = 172800
gtid-mode = ON
enforce-gtid-consistency = TRUE

View File

@@ -0,0 +1,49 @@
# 部署 MySQL 两节点互为主从+高可用
- 在每台服务器上执行如下操作
- 按实际环境修改
- docker-compose.yml
- keepalived/conf/keepalived.conf
- mysql/my.cnf
- 创建目录
```
grep '\<source:' docker-compose.yml | cut -d: -f2 | xargs mkdir -p
```
- 启动
```
docker-compose up -d
```
- 查看日志,直至出现 "MySQL is ready for connections."
```
docker-compose logs mysql
```
- 配置 mysql 互相同步
```
# 进入mysql终端
docker exec -ti mysql mysql
# 设置同步源
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '对方 host',
SOURCE_PORT = 3306,
SOURCE_USER = 'replicator',
SOURCE_PASSWORD = 'China_19$(10)!',
SOURCE_AUTO_POSITION = 1;
# 启动同步
START REPLICA;
# 查看同步状态
SHOW REPLICA STATUS\G
# 如果输出Replica_IO_Running: Yes和Replica_SQL_Running: Yes则同步正常
# 退出 mysql
quit
```
- 在其中一台 mysql 服务器上导入初始数据

View File

@@ -0,0 +1,39 @@
version: "3.7"
services:
keepalived:
image: harbor.colben.cn/general/keepalived
container_name: keepalived
restart: "on-failure"
stop_grace_period: 1m
privileged: true
network_mode: host
volumes:
- type: bind
source: ./keepalived/conf
target: /etc/keepalived
- type: bind
source: ./keepalived/log
target: /var/log/keepalived
mysql:
image: harbor.colben.cn/general/mysql:8
container_name: mysql
restart: "on-failure"
stop_grace_period: 5m
privileged: true
network_mode: host
volumes:
- type: bind
source: ./mysql/my.cnf
target: /etc/my.cnf
- type: bind
source: ./mysql/binlog
target: /var/lib/mysql-bin
- type: bind
source: ./mysql/db
target: /var/lib/mysql
- type: bind
source: ./mysql/log
target: /var/log/mysql

View File

@@ -0,0 +1,33 @@
global_defs {
router_id mysql1 # 在另一台服务器中,这里配置 mysql2
script_user root
enable_script_security
}
vrrp_script chk_mysql {
script "/sbin/ss -lnt | grep -q ':3306\>'"
interval 10
weight 0
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
virtual_router_id 13
priority 150 # 在另一台服务器中这里配置100
advert_int 2
nopreempt
interface eth0 # 这里的 eth0 是服务器的网卡名
track_script {
chk_mysql
}
authentication {
auth_type PASS
auth_pass El_en_mysql_1234
}
virtual_ipaddress {
虚拟IP/掩码 dev eth0 # 这里的eth0是服务器的网卡名
}
}

View File

@@ -0,0 +1,4 @@
CREATE USER replicator@'%' IDENTIFIED BY 'China_19$(10)!';
GRANT REPLICATION SLAVE ON *.* TO replicator@'%';
FLUSH PRIVILEGES;

View File

@@ -0,0 +1,30 @@
[mysqld]
mysqlx = OFF
skip-name-resolve = 1
max-user-connections = 600
## this should be less than 80% of total memory
innodb-buffer-pool-size = xxxxG
## this should be half of "innodb-buffer-pool-size"
innodb-buffer-pool-instances = xxxx
# binlog
## this should be an unsigned tinyint and different with the other mysql server.
server-id = xxxx
log-bin = /var/lib/mysql-bin/master
binlog-format = ROW
binlog-expire-logs-seconds = 172800
gtid-mode = ON
enforce-gtid-consistency = TRUE
# replication
replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = performance_schema.%
replicate-wild-ignore-table = sys.%
slave-parallel-workers = 2
log-slave-updates = FALSE
relay-log = /var/lib/mysql-bin/slave
relay-log-recovery = TRUE

63
mysql/Dockerfile Normal file
View File

@@ -0,0 +1,63 @@
ARG ARCH
FROM harbor.colben.cn/general/rocky$ARCH:8
MAINTAINER Colben colbenlee@gmail.com
ARG ARCH
ADD --chown=root:root /ADD/ /opt/
RUN echo -e "[mysql-connectors-community]\n\
name=MySQL Connectors Community\n\
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-connectors-community-el8$ARCH/\n\
enabled=1\n\
gpgcheck=0\n\
\n\
[mysql-tools-community]\n\
name=MySQL Tools Community\n\
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-tools-community-el8$ARCH/\n\
enabled=1\n\
gpgcheck=0\n\
\n\
[mysql80-community]\n\
name=MySQL 8.0 Community Server\n\
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-8.0-community-el8${ARCH:--x86_64}/\n\
enabled=1\n\
gpgcheck=0\n\
" > /etc/yum.repos.d/mysql-8.0.repo \
&& dnf makecache \
&& dnf install mysql-community-server -y --disablerepo=AppStream \
&& rm -rf /usr/sbin/mysqld-debug \
/var/cache/yum \
/var/lib/yum \
/var/lib/rpm \
/var/log/* \
/etc/my.cnf.d \
&& mkdir -p /var/log/mysql \
/var/lib/mysql-bin \
/etc/mysql \
&& chown -R mysql.mysql \
/var/log/mysql \
/var/lib/mysql-bin \
&& sed -i -e 's,--initialize,&-insecure,g' \
-e 's,/usr/sbin/mysqld ,&--defaults-file=/etc/mysql/my.cnf ,g' \
/usr/bin/mysqld_pre_systemd \
&& echo -e '[mysqld]\nmysqlx = OFF\n' > /etc/my.cnf \
&& echo -e '[client]\n\
socket = /run/mysqld/mysqld.sock\n\
\n\
[mysqld]\n\
datadir = /var/lib/mysql\n\
socket = /run/mysqld/mysqld.sock\n\
pid-file = /run/mysqld/mysqld.pid\n\
log-timestamps = SYSTEM\n\
log-error = /var/log/mysql/error.log\n\
character-set-server = utf8mb4\n\
default-storage-engine = innodb\n\
slow-query-log = TRUE\n\
slow-query-log-file = /var/log/mysql/slow.log\n\
default-authentication-plugin = mysql_native_password\n\
lower-case-table-names = 1\n\
\n\
[mysqladmin]\n\
user = docker\n\
password = China_19$(10)!\n\
' > /etc/mysql/my.cnf
CMD ["/opt/ccmd"]

63
mysql/Dockerfile-centos7 Normal file
View File

@@ -0,0 +1,63 @@
ARG ARCH
FROM harbor.colben.cn/general/centos$ARCH:7
MAINTAINER Colben colbenlee@gmail.com
ARG ARCH
ADD --chown=root:root /ADD/ /opt/
RUN echo -e "[mysql-connectors-community]\n\
name=MySQL Connectors Community\n\
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-connectors-community-el7$ARCH/\n\
enabled=1\n\
gpgcheck=0\n\
\n\
[mysql-tools-community]\n\
name=MySQL Tools Community\n\
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-tools-community-el7$ARCH/\n\
enabled=1\n\
gpgcheck=0\n\
\n\
[mysql80-community]\n\
name=MySQL 8.0 Community Server\n\
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-8.0-community-el7${ARCH:--x86_64}/\n\
enabled=1\n\
gpgcheck=0\n\
" > /etc/yum.repos.d/mysql-8.0.repo \
&& yum makecache fast \
&& yum install mysql-community-server -y \
&& rm -rf /usr/sbin/mysqld-debug \
/var/cache/yum \
/var/lib/yum \
/var/lib/rpm \
/var/log/* \
/etc/my.cnf.d \
&& mkdir -p /var/log/mysql \
/var/lib/mysql-bin \
/etc/mysql \
&& chown -R mysql.mysql \
/var/log/mysql \
/var/lib/mysql-bin \
&& sed -i -e 's,--initialize,&-insecure,g' \
-e 's,/usr/sbin/mysqld ,&--defaults-file=/etc/mysql/my.cnf ,g' \
/usr/bin/mysqld_pre_systemd \
&& echo -e '[mysqld]\nmysqlx = OFF\n' > /etc/my.cnf \
&& echo -e '[client]\n\
socket = /run/mysqld/mysqld.sock\n\
\n\
[mysqld]\n\
datadir = /var/lib/mysql\n\
socket = /run/mysqld/mysqld.sock\n\
pid-file = /run/mysqld/mysqld.pid\n\
log-timestamps = SYSTEM\n\
log-error = /var/log/mysql/error.log\n\
character-set-server = utf8mb4\n\
default-storage-engine = innodb\n\
slow-query-log = TRUE\n\
slow-query-log-file = /var/log/mysql/slow.log\n\
default-authentication-plugin = mysql_native_password\n\
lower-case-table-names = 1\n\
\n\
[mysqladmin]\n\
user = docker\n\
password = China_19$(10)!\n\
' > /etc/mysql/my.cnf
CMD ["/opt/ccmd"]

29
mysql/README.md Normal file
View File

@@ -0,0 +1,29 @@
# 构建 mysql 镜像
## 定制
- 安装 mysql 8.0
- 固定一些常用配置
- 第一次启动 mysql 时,会执行如下操作
- 初始化数据目录
- 自动创建一个只有 shutdown 权限的普通用户,该用户用于优雅停止 mysql__不要修改该用户任何信息__
- 自动执行 {mysql-log}/init_sql/ 下的 xxxx.sql 文件
- 每两秒检查 {mysql-log}/extra_scripts/ 下的可执行文件,发现后立即执行
## 外挂目录和文件
- /etc/my.cnf: mysql 配置文件
- /var/lib/mysql: mysql 数据目录
- /var/lib/mysql-bin: mysql binlog 目录
- /var/log/mysql: mysql 日志目录
## 引入环境变量
- SERVER_ID: mysql server id
- GROUP_REPLICATION: 是否开启组复制
- GROUP_REPLICATION_LOCAL_ADDRESS: 指定本地地址
- GROUP_REPLICATION_GROUP_SEEDS: 指定组复制的全部节点,用逗号间隔
- EXTRA_SCRIPTS: 是否执行 {mysql-log}/extra_scripts/ 下的可执行文件,默认为空,不执行
## 案例
- [Demo/SingleNode/](Demo/SingleNode/): 单节点
- [Demo/TwoMasterNodes/](Demo/TwoMasterNodes/): 两节点互为主从+高可用
- [Demo/MGR/](Demo/MGR/): 组复制

67
mysql/mysql.sh Executable file
View File

@@ -0,0 +1,67 @@
#!/bin/bash
#=========================================
# Author : colben
#=========================================
set -euo pipefail
export LANG=en_US.UTF-8
trap Quit EXIT
[ 'x86_64' == "$(uname -m)" ] && ARCH='' || ARCH="-$(uname -m)"
ROOT_DIR="$(cd $(dirname $0) && pwd)"
IMAGE="harbor.colben.cn/general/$(basename ${0%.sh})$ARCH:8"
if [ -t 0 ]; then
function Print { echo -e "\033[36;1m$(date +'[%F %T]')\033[32;1m $*\033[0m"; }
function Warn { echo -e "\033[36;1m$(date +'[%F %T]')\033[33;1m $*\033[0m"; }
function Error { echo -e "\033[36;1m$(date +'[%F %T]')\033[31;1m $*\033[0m"; exit 1; }
else
function Print { echo -e "$(date +'[%F %T INFO]') $*"; }
function Warn { echo -e "$(date +'[%F %T WARN]') $*"; }
function Error { echo -e "$(date +'[%F %T ERROR]') $*"; exit 1; }
fi
function Quit {
local exitCode=$?
[ 0 -ne $exitCode ] && Error Failed to build or push image!
[ -z "${END:-}" ] && echo && Error Interrupted manually!
Print Succeeded to build and push image.
}
function YesOrNo {
Warn $*
local sw=
while :; do
read -p '(Yes/No/Quit) ' -n1 sw
[[ "$sw" =~ ^Y|y$ ]] && echo && return 0
[[ "$sw" =~ ^N|n$ ]] && echo && return 1
[[ "$sw" =~ ^Q|q$ ]] && echo && exit 0
[ -n "$sw" ] && echo
done
}
function Update {
:
}
function Build {
local yn
cd $ROOT_DIR
docker images --format='{{.Repository}}:{{.Tag}}' | grep "^$IMAGE$" \
&& Warn Removing image $IMAGE ... \
&& docker rmi $IMAGE
Warn Building image: $IMAGE ...
docker build --force-rm --build-arg ARCH="$ARCH" -t $IMAGE .
YesOrNo Push image: $IMAGE? && docker push $IMAGE
}
function Main {
Update
Build
END=1
}
# Start here
Main