从源码解析MogDB/openGauss容器制作教程(一)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 从源码解析MogDB/openGauss容器制作教程

一、MogDB容器代码解读

1. clone代码库

[root@ecs-lee lee]# git clone https://gitee.com/enmotech/enmotech-docker-mogdb 
Cloning into 'enmotech-docker-mogdb'
... 
remote: Enumerating objects: 173, done. 
remote: Counting objects: 100% (18/18), done. 
remote: Compressing objects: 100% (16/16), done. 
remote: Total 173 (delta 6), reused 9 (delta 2), pack-reused 155 Receiving objects: 100% (173/173), 2.00 MiB | 688.00 KiB/s, done. 
Resolving deltas: 100% (87/87), done.

2. 文件结构及用意

[root@ecs-lee enmotech-docker-mogdb]# ls -lrt 
total 112 
drwxr-xr-x 2 root root 4096 Sep 8 09:30 1.0.0 
drwxr-xr-x 2 root root 4096 Sep 8 09:30 1.0.1 
drwxr-xr-x 2 root root 4096 Sep 8 09:30 1.1.0 
drwxr-xr-x 2 root root 4096 Sep 8 09:30 2.0.0 
drwxr-xr-x 2 root root 4096 Sep 8 09:30 2.0.1 
drwxr-xr-x 2 root root 4096 Sep 8 09:30 2.0.3 
drwxr-xr-x 2 root root 4096 Sep 8 09:30 3.0.1 
drwxr-xr-x 2 root root 4096 Sep 8 09:30 3.0.0 
drwxr-xr-x 2 root root 4096 Sep 8 09:30 2.1.1 
drwxr-xr-x 2 root root 4096 Sep 8 09:30 2.1.0 
-rw-r--r-- 1 root root 10147 Sep 8 09:30 README.md 
-rw-r--r-- 1 root root 8699 Sep 8 09:30 origin-opengauss-text.png 
-rw-r--r-- 1 root root 35149 Sep 8 09:30 LICENSE 
-rwxr-xr-x 1 root root 3755 Sep 8 09:30 create_master_slave.sh 
-rwxr-xr-x 1 root root 4337 Sep 8 09:30 buildDockerImage.sh
  • 1.0.0 1.1.0 … 3.0.1 为对应的数据库版本目录
  • README.md readme文件
  • origin-opengauss-text.png openGauss图片
  • LICENSE “GNU GENERAL PUBLIC LICENSE”
  • create_master_slave.sh 主备创建脚本
  • buildDockerImage.sh 创建镜像脚本
[root@ecs-lee enmotech-docker-mogdb]# tree 3.0.1 
3.0.1
├── dockerfile_amd
├── dockerfile_arm
├── entrypoint.sh
├── k8s_amd.yaml
├── k8s_arm.yaml
├── md5_file_amd64
└── md5_file_arm64
0 directories, 8 files
  • dockerfile_amd dockerfile文件 amd架构下
  • dockerfile_arm dockerfile文件 arm架构下
  • entrypoint.sh endpoint 文件用于创建DB及一些定制化功能
  • k8s_amd.yaml k8s amd架构yaml文件
  • k8s_arm.yaml k8s arm架构yaml文件
  • md5_file_amd64 用于校验amd架构下数据库安装包
  • md5_file_arm64 用于校验arm架构下数据库安装包

3. 关键文件内容解读

a. dockerfile_amd

[root@ecs-lee 3.0.1]# cat dockerfile_amd
FROM ubuntu:18.04 as builder
RUN set -eux; \
    apt-get update && apt-get install -y \
    wget && \
    wget https://gitee.com/lee1002/gosu/attach_files/943635/download/gosu-amd64  && \
    wget https://cdn-mogdb.enmotech.com/mogdb-media/3.0.1/Plugins-3.0.1-CentOS-x86_64.tar.gz && \
    wget https://gitee.com/enmotech/compat-tools/attach_files/1110114/download/compat-tools-v2022.06.28.tar && \
    wget https://gitee.com/enmotech/mogila/attach_files/954052/download/mogila-v1.0.0.bz2
FROM ubuntu:18.04
ADD  MogDB-3.0.1-CentOS-64bit.tar.gz /usr/local/mogdb
COPY --from=builder /gosu-amd64  /usr/local/bin/gosu
COPY --from=builder /Plugins-3.0.1-CentOS-x86_64.tar.gz  /tmp
COPY --from=builder /compat-tools-v2022.06.28.tar  /tmp
COPY --from=builder /mogila-v1.0.0.bz2  /tmp
COPY entrypoint.sh /usr/local/bin/
ENV LANG en_US.utf8
ENV PGDATA /var/lib/mogdb/data
RUN set -eux; \
    apt-get update && apt-get install -y \
    libaio-dev \
    libkeyutils-dev \
    libnuma-dev \
    locales \
    libreadline-dev \
    vim  \
    procps && \
    rm -rf /var/lib/apt/lists/*; \
    ln -s /lib/x86_64-linux-gnu/libreadline.so.7 /lib/x86_64-linux-gnu/libreadline.so.6; \
    groupadd -g 70 omm;  \
    useradd -u 70 -g omm -m -s /bin/bash omm;  \
    mkdir -p /var/lib/mogdb && \
    mkdir -p /usr/local/mogdb && \
    mkdir -p /var/run/mogdb  && \
    mkdir /docker-entrypoint-initdb.d && \
    mkdir -p  /usr/local/mogdb/share/postgresql/contrib && \
    tar -xf /tmp/compat-tools-v2022.06.28.tar -C /home/omm && \
    mv /home/omm/compat-tools-v2022.06.28 /home/omm/compat-tools && \
    tar -xf /tmp/mogila-v1.0.0.bz2 -C /home/omm && \
    tar -xf /tmp/Plugins-3.0.1-CentOS-x86_64.tar.gz -C /usr/local/mogdb && \
    rm -rf /usr/local/mogdb/plugin/postgis && \
    rm -f /tmp/compat-tools-v2022.06.28.tar && \
    rm -f /tmp/Plugins-3.0.1-CentOS-x86_64.tar.gz && \
    rm -f /tmp/mogila-v1.0.0.bz2 && \
    chown omm:omm /var/lib/mogdb /home/omm /var/run/mogdb /docker-entrypoint-initdb.d /usr/local/mogdb/ /usr/local/mogdb/lib /usr/local/mogdb/lib/postgresql /usr/local/mogdb/share/postgresql/contrib /usr/local/mogdb/share/postgresql/extension /usr/local/mogdb/bin && \
    locale-gen en_US.UTF-8 && \
    echo "export GAUSSHOME=/usr/local/mogdb"  >> /home/omm/.bashrc && \
    echo "export PATH=\$GAUSSHOME/bin:\$PATH " >> /home/omm/.bashrc && \
    echo "export LD_LIBRARY_PATH=\$GAUSSHOME/lib:\$LD_LIBRARY_PATH" >> /home/omm/.bashrc && \
    echo "export GAUSSLOG=/var/lib/mogdb/data/pg_log" >> /home/omm/.bashrc && \
    echo "export PGDATA=/var/lib/mogdb/data" >> /home/omm/.bashrc && \
    echo "\set PROMPT1 'MogDB%R%#'" >> /home/omm/.gsqlrc && \
    echo "\set PROMPT2 '#'" >> /home/omm/.gsqlrc && \
    echo "\set PROMPT3 '>'" >> /home/omm/.gsqlrc && \
    chown -R omm:omm /home/omm && \
    chmod +x /usr/local/bin/gosu && \
    chmod 755 /usr/local/bin/entrypoint.sh /usr/local/mogdb/plugins && \
    cp `find /usr/local/mogdb/plugins -name *.so` /usr/local/mogdb/lib/postgresql/ && \
    cp `find /usr/local/mogdb/plugins -name "*.control" -or -name "*.sql"` /usr/local/mogdb/share/postgresql/extension/ && \
    cp `find /usr/local/mogdb/plugins -name pg_repack -type f -or -name pg_bulkload -type f -or -name postgresql` /usr/local/mogdb/bin/ && \
    cp `find /usr/local/mogdb/plugins -name pg_timestamp.sql -or -name uninstall_pg_timestamp.sql` /usr/local/mogdb/share/postgresql/contrib/ && \
    rm -rf /usr/local/mogdb/plugins && \
    chmod 755 /usr/local/mogdb/lib/postgresql/* /usr/local/mogdb/share/postgresql/extension/* /usr/local/mogdb/bin/pg_repack /usr/local/mogdb/share/postgresql/contrib/pg_timestamp.sql && \
    ln -s /usr/local/bin/entrypoint.sh /
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 5432
CMD ["mogdb"]
  • FROM ubuntu:18.04 as builder
  • 两阶段构建,第一阶段准备安装包及依赖环境,
  • FROM ubuntu:18.04
  • 第二阶段从第一阶段去包及依赖环境,可以减少最终镜像大小。
  • wget
  • 下载安装包
  • COPY
  • 从第一阶段镜像导入
  • ENV
  • 配置环境变量
  • RUN
  • 准备数据库依赖环境及清理中间产物。
  • apt
  • 安装依赖包及基础环境
  • rm -rf
  • 清理依赖环境
  • mkdir
  • 创建相关目录
  • groupadd useradd
  • 增加所需用户及用户组
  • ehco
  • 配置环境变量及gsqlrc
  • chown chmod
  • 更改用户owner及权限
  • cp
  • 安装相关插件
  • locale-gen en_US.UTF-8
  • 安装语言依赖
  • ENTRYPOINT CMD
  • 组合传入mogdb参数会运entrypoint.sh

b. dockerfile_arm 文件内容和amd版本类似

c. k8s_arm.yaml

[root@ecs-lee 3.0.1]# cat k8s_arm.yaml
apiVersion: v1 --k8s api
kind: Pod -- k8s 运行种类
metadata:
  name: mogdb
spec:
  containers: --容器定义
  - name: mogdb
    image: swr.cn-north-4.myhuaweicloud.com/mogdb/mogdb:3.0.1 --容器地址
    env: -- 环境变量
    - name: GS_PASSWORD -- key
      value: "Enmo@123" -- value
    command: ["/bin/bash"] -- 执行的命令
    args: ["-c", "--", "/usr/local/bin/entrypoint.sh mogdb"] -- 执行的参数
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 5432 -- 容器端口
      name: mogdb
      protocol: TCP
    volumeMounts:
    - mountPath: /mogdb
      name: data
  imagePullSecrets:
  - name: default-secret
  volumes:
  - name: data
    emptyDir: {}

d. md5_file_arm64

[root@ecs-lee 3.0.1]# cat md5_file_arm64 b726902ab90c1f8f1f0c0f9886de914f MogDB-3.0.
目录
相关文章
|
22天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
6天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
10天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
15天前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
20天前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
71 0
|
29天前
|
测试技术 Python
python自动化测试中装饰器@ddt与@data源码深入解析
综上所述,使用 `@ddt`和 `@data`可以大大简化写作测试用例的过程,让我们能专注于测试逻辑的本身,而无需编写重复的测试方法。通过讲解了 `@ddt`和 `@data`源码的关键部分,我们可以更深入地理解其背后的工作原理。
24 1
|
20天前
|
Java Spring
🔥JSF 与 Spring 强强联手:打造高效、灵活的 Web 应用新标杆!💪 你还不知道吗?
【8月更文挑战第31天】JavaServer Faces(JSF)与 Spring 框架是常用的 Java Web 技术。本文介绍如何整合两者,发挥各自优势,构建高效灵活的 Web 应用。首先通过 `web.xml` 和 `ContextLoaderListener` 配置 Spring 上下文,在 `applicationContext.xml` 定义 Bean。接着使用 `@Autowired` 将 Spring 管理的 Bean 注入到 JSF 管理的 Bean 中。
30 0
|
20天前
|
JavaScript 前端开发 开发者
深入解析Angular装饰器:揭秘框架核心机制与应用——从基础用法到内部原理的全面教程
【8月更文挑战第31天】本文深入解析了Angular框架中的装饰器特性,包括其基本概念、使用方法及内部机制。装饰器作为TypeScript的关键特性,在Angular中用于定义组件、服务等。通过具体示例介绍了`@Component`和`@Injectable`装饰器的应用,展示了如何利用装饰器优化代码结构与依赖注入,帮助开发者构建高效、可维护的应用。
21 0
|
25天前
|
存储
Cmake官方教程解析
Cmake官方教程解析
30 0

推荐镜像

更多