DM8 安装包打包成 Docker 镜像

发布时间:2026/7/31 11:56:24
DM8 安装包打包成 Docker 镜像
本文介绍如何将达梦 DM8 的 Linux 安装包打包为私有 Docker 镜像。适用于达梦下载中心只提供.zip压缩包、解压后为.iso安装介质而没有提供可直接docker load的官方镜像包的情况。本文最终会构建出一个本地镜像dm8:local-amd64后续可以使用docker save导出该镜像在其他服务器通过docker load导入再部署 DM8 数据库。文章目录一、选择正确的 DM8 安装包二、从 ZIP 和 ISO 中提取 DMInstall.bin1. 创建构建目录2. 解压 ZIP 与 ISO三、准备镜像构建文件1. 创建静默安装配置文件2. 创建容器启动脚本3. 创建 Dockerfile四、构建 DM8 私有镜像五、首次运行验证镜像六、导出自建镜像到其他服务器七、常见问题1. 对 ISO 执行 docker load 报错2. 构建时报 exec format error3. DMInstall.bin 无法执行4. 构建时报 LANGUAGE 相关错误5. 重启容器后初始化参数没有变化6. 不要把镜像当成数据库备份一、选择正确的 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_64Docker 主机不兼容。下载文件通常是.zip解压后包含.iso。这是正常的 DM8 Linux 安装介质不是 Docker 镜像不能执行docker load -i xxx.iso。二、从 ZIP 和 ISO 中提取 DMInstall.bin1. 创建构建目录以下命令在 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-build2. 解压 ZIP 与 ISO将下载到的dm8_..._x86_ubuntu22_64.zip上传到服务器任意目录。下面使用libarchive-tools解压不依赖挂载 ISO也适合没有图形界面的服务器sudo apt update sudo apt install-y libarchive-tools# pwd 查看路径 /home/wen/dm8bsdtar-xf/实际路径/dm8_实际版本_x86_ubuntu22_64.zip-C/opt/dm8-image-build/download上传的 DM8 安装包文件及其所在路径示例找到 ZIP 内的 ISO 文件find/opt/dm8-image-build/download-typef-iname*.iso将输出的实际 ISO 路径填入下面命令bsdtar-xf/opt/dm8-image-build/download/实际文件名.iso-C/opt/dm8-image-build/media find/opt/dm8-image-build/media-typef-nameDMInstall.bin把DMInstall.bin放到 Docker 构建目录根部install-m 0755/opt/dm8-image-build/media/DMInstall.bin/opt/dm8-image-build/DMInstall.binls-lh/opt/dm8-image-build/DMInstall.bin如果DMInstall.bin位于 ISO 解压后的子目录请把上面命令中的来源路径替换为find输出的实际路径。三、准备镜像构建文件进入构建目录cd/opt/dm8-image-build1. 创建静默安装配置文件创建dm_install.xml用于在 Docker 构建阶段无交互安装 DM8 软件但不在构建阶段创建数据库实例vim dm_install.xml?xml version1.0 encodingUTF-8?DATABASELANGUAGEEN/LANGUAGETIME_ZONE08:00/TIME_ZONEKEY/KEYINSTALL_TYPE1/INSTALL_TYPEINSTALL_PATH/home/dmdba/dmdbms/INSTALL_PATHINIT_DBN/INIT_DB/DATABASELANGUAGE只能使用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 bashset-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.iniif[$(id-u)0];then mkdir-p$DATA_DIRchown-R dmdba:dinstall$DATA_DIRexec gosu dmdba$0$fiif[!-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_PWDfi exec$DM_HOME/bin/dmserver$DB_INI-noconsole3. 创建 Dockerfile创建Dockerfile。ubuntu:22.04与本篇选择的Ubuntu22DM8 安装包对应vim DockerfileFROM ubuntu:22.04 ENV DEBIAN_FRONTENDnoninteractive 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 --chowndmdba: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 directorysed-is/\r$//docker-entrypoint.sh镜像构建时必须能获得ubuntu:22.04基础镜像。若目标服务器没有外网应在可联网的机器构建然后按照本文后面的“导出镜像”步骤传到目标服务器。四、构建 DM8 私有镜像确认构建目录中有四个文件cd/opt/dm8-image-buildls-lh DMInstall.bin dm_install.xml docker-entrypoint.sh Dockerfile构建镜像docker build-t dm8:local-amd64.docker imagelsdm8成功后应能看到dm8:local-amd64。构建日志中DMInstall.bin -q返回成功说明 DM8 软件已经写入镜像此时尚未创建业务数据库数据。构建过程中不要将dm.key、真实数据库密码或业务数据写入 Dockerfile。若许可证需要单独文件应按照许可证要求在运行容器时以只读挂载方式提供。五、首次运行验证镜像先创建测试数据卷和两个示例密码docker volume create dm8-build-test-dataexport DM_SYSDBA_PWDDm8Pass2026Aexport DM_SYSAUDITOR_PWDDm8Audit2026A使用不常见的宿主机端口15236进行测试避免占用正式部署常用的5236docker run-d \--name dm8-build-test \--restartno \-p 15236:5236 \-v dm8-build-test-data:/opt/dmdbms/data\-e DB_NAMEDM8TEST \-e INSTANCE_NAMEDM8TEST \-e PAGE_SIZE16 \-e EXTENT_SIZE32 \-e LOG_SIZE1024 \-e CHARSET1 \-e CASE_SENSITIVE0 \-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登录后执行selectnamefromv$database;selectinstance_name,status$fromv$instance;exit;实例状态为OPEN即表示自建镜像可以正常初始化和运行。六、导出自建镜像到其他服务器docker save导出的是镜像本身不包含测试数据卷或容器数据。为防止把不同 CPU 架构的镜像混淆构建标签、传输标签和归档文件统一使用dm8:local-arch、dm8:offline-arch与dm8-offline-arch.tar。Docker 架构标识常见系统输出构建镜像标签传输镜像标签归档文件名amd64x86_64、x64dm8:local-amd64dm8:offline-amd64dm8-offline-amd64.tararm64aarch64、arm64dm8:local-arm64dm8:offline-arm64dm8-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.sha256ls-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 imagelsdm8后续 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基础镜像应使用ENLANGUAGEEN/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 的备份恢复机制处理并定期验证可恢复性。