构建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.gz | opengauss的轻量版本 |
openeuler/openeuler:22.03 | opengauss原生适配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 - opengaussmkdir /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