DM8 安装包打包成 Docker 镜像
本文介绍如何将达梦 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 镜像。 |
rh6、CentOS7 |
需要配套的 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_TYPE 为 1 时只安装数据库服务器组件;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
创建 Dockerfile。ubuntu: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_64、x64 |
dm8:local-amd64 |
dm8:offline-amd64 |
dm8-offline-amd64.tar |
arm64 |
aarch64、arm64 |
dm8:local-arm64 |
dm8:offline-arm64 |
dm8-offline-arm64.tar |
本文使用的是 X86 安装包,因此下面的实际示例为 amd64。x86 通常表示 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。若是 aarch64 或 arm64,必须下载 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,说明值不是 ZH 或 EN。若报 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 的备份恢复机制处理,并定期验证可恢复性。
更多推荐
所有评论(0)