构建openGauss-Lite-5.0.2-openEuler基础镜像

构建opengauss数据库基础镜像,需要克服几个困难:

1、使用root和opengauss普通用户来回切换:如果使用Dockerfile中RUN指令,执行su - user切换不生效。

2、需要设置sysctl内核参数;但是,即便使用了--privileged,设置的sysctl也不会被写到image配置中,即便修改了/etc/sysctl.conf,也不会生效;通过--sysctl kernel.sem=value进行设置,su - user切换之后也会失效。

3、容器内的data目录持久化到宿主机上。我们运行容器使用-v /host-directory:/container-directory,其方向是将宿主机的目录挂载到容器内部,如果/container-directory下有数据,也会被覆盖。反方向将容器内的目录挂载到宿主机是不行的。

组件说明
openGauss-Lite-5.0.2-openEuler-x86_64.tar.gzopengauss的轻量版本
openeuler/openeuler:22.03opengauss原生适配openEuler

STEP 1 docker build第一层镜像

 install.sh

#!/bin/bash
set -e

useradd opengauss
echo "install 字符集===================================>"
dnf -y install glibc-locale-source && rm -f /usr/lib/locale/locale-archive 
localedef -f UTF-8 -i en_US en_US.UTF-8 && export LC_ALL=en_US.UTF-8
echo "install 依赖包===================================>"
dnf -y install util-linux readline-devel libaio-devel net-tools findutils
echo "install 时区===================================>"
rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

su - opengauss -C 'tar zxvf /tools/openGauss-Lite-5.0.2-openEuler-x86_64.tar.gz -C /home/opengauss/'

if [ $? -eq 0 ]; then
  rm -rf /var/cache/dnf/*
  rm -f /tools/openGauss-Lite-5.0.2-openEuler-x86_64.tar.gz
fi

 Dockerfile

FROM openeuler/openeuler:22.03
COPY install.sh openGauss-Lite-5.0.2-openEuler-x86_64.tar.gz /tools/
RUN sh /tools/install.sh && rm -f /tools/install.sh
ENV LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8

构建

docker build -t opengauss:v1 .

STEP 2 docker commit第二层镜像

mgmt_opengauss.sh

#!/bin/bash

source /home/opengauss/.bashrc

if [ ! -f /home/opengauss/openGauss/MH/data/postgresql.conf ];then
    mv /home/opengauss/openGauss/data /home/opengauss/openGauss/MH/
fi
PG_HOME=/home/opengauss/openGauss/MH/data

if [ $? -eq 0 ]; then
/home/opengauss/openGauss/install/bin/gs_ctl start -D $PG_HOME -Z single_node -l $PG_HOME/pg_log/logfile
fi
if [ $? -eq 0 ]; then
/home/opengauss/openGauss/install/bin/gs_ctl status -D $PG_HOME >>$PG_HOME/pg_log/logfile 
/usr/bin/tail -f $PG_HOME/pg_log/logfile 
fi

启动容器,并在容器内部操作

# 容器启动命令
docker run -it --privileged -h opengauss --name=opengauss -v /root/build-images/opengauss/:/tools opengauss:v1 /bin/bash

# 配置kernel.sem(只限于能够安装和初始化成功,此后启动的时候,sem还会变成默认的)
echo "kernel.sem = 32000      1024000000      500     32000" >>/etc/sysctl.conf && sysctl -p

# 配置启动脚本
cp /tools/mgmt_opengauss.sh /mgmt_opengauss.sh && chown opengauss: /mgmt_opengauss.sh

# 配置字符编码
echo "export LC_ALL=en_US.UTF-8" >>/home/opengauss/.bashrc 
echo "export LANG=en_US.UTF-8 " >>/home/opengauss/.bashrc 

# 安装openGauss
cd /home/opengauss/ && su - opengauss

mkdir /home/opengauss/openGauss
echo '密码'|sh install.sh --mode single -D /home/opengauss/openGauss/data -R /home/opengauss/openGauss/install --start

# 清理安装缓存
source /home/opengauss/.bashrc
/home/opengauss/openGauss/install/bin/gs_ctl stop
echo >/home/opengauss/.bash_history  && exit
echo >/root/.bash_history

docker commit

docker commit 容器ID opengauss:V2

STEP 3 docker build第三层镜像

Dockerfile

FROM opengauss:v2
USER opengauss
EXPOSE 5432
VOLUME  ["/home/opengauss/openGauss/data"]
ENTRYPOINT ["/bin/sh", "/mgmt_opengauss.sh"]

STEP 4 启动容器

# 宿主机创建共享目录/opengauss
rm -rf /opengauss/* && mkdir /opengauss && chmod 777 /opengauss
# 启动容器
docker run -d --sysctl kernel.sem="32000      1024000000      500     32000" -h opengauss --name=opengauss -v /opengauss:/home/opengauss/openGauss/MH opengauss:v3

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值