本文介绍如何将达梦 DM8 的 Linux 安装包打包为私有 Docker 镜像。适用于达梦下载中心只提供 .zip 压缩包、解压后为 .iso 安装介质,而没有提供可直接 docker load 的官方镜像包的情况。

本文最终会构建出一个本地镜像:

dm8:local-amd64

后续可以使用 docker save 导出该镜像,在其他服务器通过 docker load 导入,再部署 DM8 数据库。


一、选择正确的 DM8 安装包

下载地址:https://eco.dameng.com/download/

在达梦下载中心的开发版页面,按下面的组合选择:

下载项 选择
产品 开发版(X86 平台)
CPU 平台 X86
操作系统 Ubuntu22

当前宿主机即使是 Ubuntu 26.04,也选择 Ubuntu22。原因是本教程会使用 ubuntu:22.04 作为 Docker 基础镜像,DM8 的 Ubuntu 22 安装介质与容器用户态匹配;Docker 容器使用宿主机内核,因此 Ubuntu 22 用户态可以运行在 Ubuntu 26.04 的 Docker 主机上。

不要选择以下安装包:

选项 不选择的原因
Win_64 得到的是 Windows 安装程序,不能构建 Linux Docker 镜像。
rh6CentOS7 需要配套的 RHEL/CentOS 基础镜像,本教程不使用这一套环境。
ARM 平台 amd64/x86_64 Docker 主机不兼容。

下载文件通常是 .zip,解压后包含 .iso。这是正常的 DM8 Linux 安装介质,不是 Docker 镜像,不能执行 docker load -i xxx.iso


二、从 ZIP 和 ISO 中提取 DMInstall.bin

1. 创建构建目录

以下命令在 Ubuntu Docker 主机上执行:

sudo install -d -m 0755 /opt/dm8-image-build/download /opt/dm8-image-build/media
sudo chown -R "$USER":"$USER" /opt/dm8-image-build

在这里插入图片描述

2. 解压 ZIP 与 ISO

将下载到的 dm8_..._x86_ubuntu22_64.zip 上传到服务器任意目录。下面使用 libarchive-tools 解压,不依赖挂载 ISO,也适合没有图形界面的服务器:

sudo apt update
sudo apt install -y libarchive-tools

在这里插入图片描述

# pwd 查看路径  /home/wen/dm8
bsdtar -xf /实际路径/dm8_实际版本_x86_ubuntu22_64.zip -C /opt/dm8-image-build/download

上传的 DM8 安装包文件及其所在路径示例:
在这里插入图片描述
在这里插入图片描述

找到 ZIP 内的 ISO 文件:

find /opt/dm8-image-build/download -type f -iname '*.iso'

将输出的实际 ISO 路径填入下面命令:

bsdtar -xf /opt/dm8-image-build/download/实际文件名.iso -C /opt/dm8-image-build/media
find /opt/dm8-image-build/media -type f -name 'DMInstall.bin'

DMInstall.bin 放到 Docker 构建目录根部:

install -m 0755 /opt/dm8-image-build/media/DMInstall.bin /opt/dm8-image-build/DMInstall.bin
ls -lh /opt/dm8-image-build/DMInstall.bin

在这里插入图片描述

如果 DMInstall.bin 位于 ISO 解压后的子目录,请把上面命令中的来源路径替换为 find 输出的实际路径。


三、准备镜像构建文件

进入构建目录:

cd /opt/dm8-image-build

1. 创建静默安装配置文件

创建 dm_install.xml,用于在 Docker 构建阶段无交互安装 DM8 软件,但不在构建阶段创建数据库实例:

vim dm_install.xml
<?xml version="1.0" encoding="UTF-8"?>
<DATABASE>
  <LANGUAGE>EN</LANGUAGE>
  <TIME_ZONE>+08:00</TIME_ZONE>
  <KEY></KEY>
  <INSTALL_TYPE>1</INSTALL_TYPE>
  <INSTALL_PATH>/home/dmdba/dmdbms</INSTALL_PATH>
  <INIT_DB>N</INIT_DB>
</DATABASE>

在这里插入图片描述

LANGUAGE 只能使用 ZH(中文)或 EN(英文),值必须大写。本教程的 ubuntu:22.04 基础镜像默认不是中文 OS,因此使用 EN;这只影响安装器界面语言,不影响数据库字符集。INSTALL_TYPE1 时只安装数据库服务器组件;INIT_DB 设置为 N,数据库实例会在容器首次运行时创建。达梦的静默安装命令格式为 ./DMInstall.bin -q 配置文件全路径

2. 创建容器启动脚本

创建 docker-entrypoint.sh。脚本会在首次启动且数据目录为空时执行 dminit 初始化数据库;后续启动发现已有 dm.ini 后只启动数据库,不会重复初始化。

vim docker-entrypoint.sh
#!/usr/bin/env bash
set -Eeuo pipefail

DM_HOME=/home/dmdba/dmdbms
DATA_DIR="${DM_DATA_DIR:-/opt/dmdbms/data}"
DB_NAME="${DB_NAME:-DAMENG}"
DB_INI="$DATA_DIR/$DB_NAME/dm.ini"

if [ "$(id -u)" = "0" ]; then
  mkdir -p "$DATA_DIR"
  chown -R dmdba:dinstall "$DATA_DIR"
  exec gosu dmdba "$0" "$@"
fi

if [ ! -f "$DB_INI" ]; then
  : "${SYSDBA_PWD:?首次启动必须设置 SYSDBA_PWD}"
  : "${SYSAUDITOR_PWD:?首次启动必须设置 SYSAUDITOR_PWD}"

  "$DM_HOME/bin/dminit" \
    PATH="$DATA_DIR" \
    DB_NAME="$DB_NAME" \
    INSTANCE_NAME="${INSTANCE_NAME:-DMSERVER}" \
    PORT_NUM="${PORT_NUM:-5236}" \
    PAGE_SIZE="${PAGE_SIZE:-16}" \
    EXTENT_SIZE="${EXTENT_SIZE:-32}" \
    LOG_SIZE="${LOG_SIZE:-1024}" \
    CHARSET="${CHARSET:-1}" \
    CASE_SENSITIVE="${CASE_SENSITIVE:-0}" \
    SYSDBA_PWD="$SYSDBA_PWD" \
    SYSAUDITOR_PWD="$SYSAUDITOR_PWD"
fi

exec "$DM_HOME/bin/dmserver" "$DB_INI" -noconsole

在这里插入图片描述

3. 创建 Dockerfile

创建 Dockerfileubuntu:22.04 与本篇选择的 Ubuntu22 DM8 安装包对应:

vim Dockerfile
FROM ubuntu:22.04

ENV DEBIAN_FRONTEND=noninteractive
ENV DM_HOME=/home/dmdba/dmdbms
ENV DM_DATA_DIR=/opt/dmdbms/data
ENV PATH=/home/dmdba/dmdbms/bin:$PATH
ENV LD_LIBRARY_PATH=/home/dmdba/dmdbms/bin

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        gosu \
        libaio1 \
        libnsl2 \
        procps \
    && rm -rf /var/lib/apt/lists/*

RUN groupadd --gid 1001 dinstall \
    && useradd --uid 1001 --gid dinstall --create-home --shell /bin/bash dmdba \
    && install -d -o dmdba -g dinstall "$DM_HOME" "$DM_DATA_DIR" /opt/dm-install

WORKDIR /opt/dm-install
COPY --chown=dmdba:dinstall DMInstall.bin dm_install.xml ./
RUN chmod 0755 DMInstall.bin \
    && su -s /bin/bash dmdba -c '/opt/dm-install/DMInstall.bin -q /opt/dm-install/dm_install.xml' \
    && rm -rf /opt/dm-install

COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod 0755 /usr/local/bin/docker-entrypoint.sh

EXPOSE 5236
VOLUME ["/opt/dmdbms/data"]
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

如果在 Windows 编辑过 docker-entrypoint.sh,构建前统一为 Linux 换行符,避免容器报 /usr/bin/env: 'bash\r': No such file or directory

sed -i 's/\r$//' docker-entrypoint.sh

在这里插入图片描述

镜像构建时必须能获得 ubuntu:22.04 基础镜像。若目标服务器没有外网,应在可联网的机器构建,然后按照本文后面的“导出镜像”步骤传到目标服务器。


四、构建 DM8 私有镜像

确认构建目录中有四个文件:

cd /opt/dm8-image-build
ls -lh DMInstall.bin dm_install.xml docker-entrypoint.sh Dockerfile

在这里插入图片描述

构建镜像:

docker build -t dm8:local-amd64 .
docker image ls dm8

在这里插入图片描述

成功后应能看到 dm8:local-amd64。构建日志中 DMInstall.bin -q 返回成功,说明 DM8 软件已经写入镜像;此时尚未创建业务数据库数据。

构建过程中不要将 dm.key、真实数据库密码或业务数据写入 Dockerfile。若许可证需要单独文件,应按照许可证要求在运行容器时以只读挂载方式提供。


五、首次运行验证镜像

先创建测试数据卷和两个示例密码:

docker volume create dm8-build-test-data
export DM_SYSDBA_PWD='Dm8Pass2026A'
export DM_SYSAUDITOR_PWD='Dm8Audit2026A'

使用不常见的宿主机端口 15236 进行测试,避免占用正式部署常用的 5236

docker run -d \
  --name dm8-build-test \
  --restart=no \
  -p 15236:5236 \
  -v dm8-build-test-data:/opt/dmdbms/data \
  -e DB_NAME=DM8TEST \
  -e INSTANCE_NAME=DM8TEST \
  -e PAGE_SIZE=16 \
  -e EXTENT_SIZE=32 \
  -e LOG_SIZE=1024 \
  -e CHARSET=1 \
  -e CASE_SENSITIVE=0 \
  -e SYSDBA_PWD="$DM_SYSDBA_PWD" \
  -e SYSAUDITOR_PWD="$DM_SYSAUDITOR_PWD" \
  dm8:local-amd64

查看启动日志:

docker logs -f dm8-build-test

在这里插入图片描述

日志确认数据库已启动后,使用 disql 验证:

docker exec -it dm8-build-test /home/dmdba/dmdbms/bin/disql SYSDBA/Dm8Pass2026A

登录后执行:

select name from v$database;
select instance_name, status$ from v$instance;
exit;

在这里插入图片描述

实例状态为 OPEN 即表示自建镜像可以正常初始化和运行。


六、导出自建镜像到其他服务器

docker save 导出的是镜像本身,不包含测试数据卷或容器数据。为防止把不同 CPU 架构的镜像混淆,构建标签、传输标签和归档文件统一使用 dm8:local-<arch>dm8:offline-<arch>dm8-offline-<arch>.tar

Docker 架构标识 常见系统输出 构建镜像标签 传输镜像标签 归档文件名
amd64 x86_64x64 dm8:local-amd64 dm8:offline-amd64 dm8-offline-amd64.tar
arm64 aarch64arm64 dm8:local-arm64 dm8:offline-arm64 dm8-offline-arm64.tar

本文使用的是 X86 安装包,因此下面的实际示例为 amd64x86 通常表示 32 位架构,不是本文支持的 x86_64 / amd64 环境。若要导出 ARM 镜像,必须先使用匹配的 ARM 安装包和基础镜像完成构建,不能仅修改文件名。

导出前确认镜像实际架构:

docker image inspect dm8:local-amd64 --format '{{.Architecture}}'

在这里插入图片描述

当前教程应输出 amd64。随后重新打带架构标识的标签并导出:

cd /opt/dm8-image-build
docker tag dm8:local-amd64 dm8:offline-amd64
docker save -o dm8-offline-amd64.tar dm8:offline-amd64
sha256sum dm8-offline-amd64.tar > dm8-offline-amd64.tar.sha256
ls -lh dm8-offline-amd64.tar dm8-offline-amd64.tar.sha256

在这里插入图片描述

将这两个文件传到目标服务器后执行:

sha256sum -c dm8-offline-amd64.tar.sha256
docker load -i dm8-offline-amd64.tar
docker image ls dm8

后续 DM8 正式容器的创建、端口映射、数据卷和日常运维,请使用《Docker 部署 DM8》文章中的步骤。


七、常见问题

1. 对 ISO 执行 docker load 报错

.iso 是 DM8 安装介质,不是 Docker 镜像归档。正确流程是提取 DMInstall.bin,使用 Dockerfile 构建 dm8:local-amd64,再对该镜像执行 docker save

2. 构建时报 exec format error

通常是 CPU 架构不一致。本文只适用于 amd64/x86_64 主机与下载中心的 X86 安装包。先执行:

uname -m

输出应为 x86_64。若是 aarch64arm64,必须下载 ARM 版本安装包并使用相应的 ARM 基础镜像。

3. DMInstall.bin 无法执行

确认下载的是 Ubuntu22 的 Linux X86 包,且 Dockerfile 中保留了:

chmod 0755 DMInstall.bin

如果安装程序提示缺少动态库,应先检查所选安装包和 ubuntu:22.04 是否匹配,不要改用 Windows、RHEL 或 ARM 安装包混合构建。

4. 构建时报 LANGUAGE 相关错误

静默安装配置中的 LANGUAGE 只能使用 ZH(中文)或 EN(英文),不能使用 CHS。对本教程的默认 ubuntu:22.04 基础镜像,应使用 EN

<LANGUAGE>EN</LANGUAGE>

在这里插入图片描述

若报 The value of LANGUAGE is error,说明值不是 ZHEN。若报 The language of current OS is not chinese,说明在非中文 OS 中选择了 ZH;改用 EN,或先在基础镜像中完整配置中文语言环境后再使用 ZH。安装程序因上述任一配置解析失败都会退出,Docker 构建通常显示为 DMInstall.bin -q 步骤失败并返回 exit code: 252

5. 重启容器后初始化参数没有变化

入口脚本只在数据卷为空时执行 dminit。数据库已创建后,PAGE_SIZE、字符集、数据库名和大小写敏感等初始化参数不会因重新运行容器而改变。这是为了防止覆盖已有数据。

6. 不要把镜像当成数据库备份

镜像只包含 DM8 软件和启动脚本,不包含 Docker 数据卷中的业务数据。生产数据应使用 DM8 的备份恢复机制处理,并定期验证可恢复性。

更多推荐