Docker Dokerfile构建KingbaseV8R6镜像

1 制作kingbase 数据库软件包

找到kingbase 数据库已安装完成的服务器,打包数据库软件并下载。

cd $KINGBASE_HOME
tar -czvf kingbase.tar.gz Server/
Warning

后面要用到这个压缩包,如果想要制作其他版本的数据库软件包,方法同上。

2 创建工作目录

1、首先使用 docker root 用户,创建一个 kes_build 工作目录:

mkdir ~/kes_build 

2、上传KESV8R6 的 tar 包和授权文件至 mkdir ~/kes_build 目录。

ls ~/kes_build
//屏幕输出:
kingbase.tar.gz  license.dat

3、创建Dockerfile 和 run.sh 文件。

touch Dockerfile docker-entrypoint.sh

3 编写 docker-entrypoint.sh 脚本

此脚本主要是在启动容器时,需要做的一些操作。

第一,此脚本会判断当前数据目录是否已经初始化了。然后回赋值一个全局变量 DATABASE_ALREADY_EXISTS 。此功能主要由 check_is_init 函数实现。
第二,此脚本根据 DATABASE_ALREADY_EXISTS 变量值,判断是否需要初始化数据库集簇。如果当前数据目录不存在,则开始初始化数据库集簇。此功能主要是由 db_init 函数实现。
第三、初始化完成之后,使用 sys_ctl 命令启动数据库。

所以这个脚本能够作为容器的启动脚本。保证每次数据库自动启动。

vi ~/kes_build/docker-entrypoint.sh
--------------------input------------------------------
#!/bin/sh
DB_PATH=/opt/kingbase       # kingbase server Home environment
DATA_DIR=/opt/kingbase/data # kingbase KINGBASE_DATA environment
LOG_FILE=${DB_PATH}/logfile # kingbase log file
PASSWORD_FILE=${DB_PATH}/password  # kingbase password file
rm -rf ${DATA_DIR}/.DS_Store
check_is_init() {
        declare -g DATABASE_ALREADY_EXISTS
        if [ -d "${DATA_DIR}" -a `ls -A ${DATA_DIR}|wc -w` -ne 0 ];then
                DATABASE_ALREADY_EXISTS='true'
        fi
}
db_init(){
        mkdir -p ${DATA_DIR}
        chown -R kingbase:kingbase ${DATA_DIR}
        chmod 700 ${DATA_DIR}
        echo ${SYSTEM_PWD-123456} > ${DB_PATH}/password
        cd ${DB_PATH}/Server/bin/
        #extraParams="--encoding=UTF8 --case-insensitive" 
        ./initdb -U${SYSTEM_USER-SYSTEM} --pwfile=${DB_PATH}/password -E UTF8 -m ${DB_MODE-oracle} ${DATA_DIR} ${extraParams}
}
check_is_init
if [ -z "${DATABASE_ALREADY_EXISTS}" ];then
        db_init
        if [ $? -ne 0 ];then
                echo "initdb failed"
                exit 1
        fi
fi
if [ -f "${DB_PATH}/Server/bin/license.dat" ];then
        cp ${DB_PATH}/Server/bin/license.dat ${DB_PATH}/
fi
${DB_PATH}/Server/bin/sys_ctl -D ${DATA_DIR} -l ${LOG_FILE} start
sleep 15
exec tail -f ${LOG_FILE}

4 编写 Dockerfile 文件

FROM centos:7
RUN mkdir /opt/kingbase && groupadd kingbase && useradd -g kingbase -m -d /opt/kingbase -s /bin/bash kingbase
WORKDIR /opt/kingbase
ADD docker-entrypoint.sh ./
ADD license.dat ./
ADD kingbase.tar.gz ./
RUN chmod +x docker-entrypoint.sh
RUN chown -R kingbase:kingbase /opt/
ENV PATH /opt/kingbase/Server/bin:$PATH
ENV DB_VERSION V008R006C005B0023
USER kingbase
EXPOSE 54321
ENTRYPOINT ["/opt/kingbase/docker-entrypoint.sh"]
行数 说明
1 从centos:7镜像开始制作。
2 创建数据库 HOME 目录,添加kingbase用户。
3 指定工作目录,后面的操作将会在此目录中执行。
4 将容器启动时需要运行的脚本添加到镜像。
5 将license.dat 文件添加到镜像。
6 将数据库精简安装包添加到镜像,注意压缩包会被解压。
7 将赋予初始化脚本可执行权限。
8 更改容器内部的目录权限。
9 指定生效环境的变量,此步骤会添加到所有用户。
10 指定数据库版本环境变量。
11 默认使用kingbase用户执行初始化脚本。
12 开放端口 54321 。
13 指定初始化脚本的位置。

5 创建镜像

cd ~/kes_build 
docker build --no-cache -t kingbase:v8r6 .

2、查看镜像

docker images list 

更多命令语法请参考: docker images

6 创建容器

6.1 无数据卷

 docker run -d --name kingbase -p 54321:54321 -e SYSTEM_USER=system -e SYSTEM_PWD=kingbase  kingbase:v8r6

查看当前数据库版本

docker ps -a
docker exec -it  kingbase /bin/bash
ksql test system -c 'select version()'

6.2 有数据卷

1、创建数据卷。

mkdir -p /opt/kingbase/data
chown docker:docker /opt/kingbaes/data

2、创建容器并运行。

 docker run -d --privileged --name kingbase -p 54321:54321 -e SYSTEM_USER=system -e SYSTEM_PWD=kingbase  -v /opt/kingbase/data:/opt/kingbase/data kingbase:v8r6

由于数据库初始化时需要更改 data 目录权限,所以如果挂载外部数据卷时,需要使用 --privileged 选项。

3、查看数据库数据库版本。

docker ps -a
docker exec -it  kingbase /bin/bash
ksql test system -c 'select version()'