【问题标题】:Customize DB2 docker image自定义 DB2 docker 镜像
【发布时间】:2021-05-30 03:17:47
【问题描述】:

IBM 为 DB2 提供了一个 Docker 映像,可在 https://hub.docker.com/r/ibmcom/db2 获得该映像

如 Docker Hub 中所述,可以通过创建派生的 Docker 镜像来配置数据库,该镜像带有附加脚本(添加在 /var/custom 中)以及所有必要的自定义(例如创建架构)。

FROM ibmcom/db2

RUN mkdir /var/custom
COPY createschema.sh /var/custom
RUN chmod a+x /var/custom/createschema.sh

此脚本在容器启动时执行,在 Db2 设置完成之后。

有没有办法构建一个预先执行脚本的 Docker 映像?

我希望在映像本身中配置数据库,以便从映像生成的新容器在启动时不必执行初始化步骤。

脚本不能仅在 Dockerfile 中使用 RUN 命令执行,因为 DB2 设置仅在容器启动时执行。有没有办法触发这个设置,然后直接在 Dockerfile 中运行自定义配置脚本?

如果我尝试执行设置脚本(这是官方图像中的 ENTRYPOINT,我可以对其进行更改以自定义图像):

FROM ibmcom/db2
ENV LICENSE=accept
RUN /var/db2_setup/lib/setup_db2_instance.sh

启动DB2时出现故障不知道如何解决:

Starting DB2...

02/28/2021 09:54:31     0   0   SQL1042C  An unexpected system error occurred.

我可以从正在运行的容器(使用docker commit)创建映像,但我希望通过 Dockerfile 自动执行映像构建过程。

【问题讨论】:

    标签: docker db2


    【解决方案1】:

    这种情况的一般步骤是:

    1. 找到图片的ENTRYPOINT,分析图片创建后是如何初始化的
    2. 准备新的 dockerbuild 文件
      1. 调用 ENTRYPOINT 命令以使用RUN 初始化图像
      2. 运行您自己的脚本
      3. 关闭已初始化的进程以刷新缓冲区(这对数据库映像很重要)
      4. 根据需要创建新的 ENTRYPOINT

    到目前为止,您所做的是正确的步骤,但是您需要确保在映像构建结束时关闭数据库以强制将数据库的更改写入文件。 另外需要分析初始化容器内的数据库对新镜像启动过程的影响(比如使用volume mounts)。

    SQL1042C 与文件损坏有关,但是您可以在数据库日志中找到更多详细信息并验证确切的问题。

    【讨论】:

    • 我在 DB2 日志中找不到 SQL1042C 的根本原因。我的假设是问题出在基本 DB2 映像的定义方式上。它定义了一个 /database VOLUME。据我了解,这意味着将在容器启动时为此挂载点自动创建一个新的未命名卷。但是,通过在我的 Dockerfile 中运行 ENTRYPOINT 脚本,它已经尝试在此路径上写入数据(在已声明但尚未创建的卷上)。我不确定 docker build 命令是如何处理这个问题的,以及它是否可能是 SQL1042C 的原因。
    • 不幸的是,我无法在 Dockerfile 中“取消定义”卷,并且将所有数据重定向到 /database 以外的其他路径可能意味着必须在基础映像中重写大量脚本。
    • 一种方法是在初始化后将数据文件(/database)移动到另一个文件夹,而不是编写新的启动脚本,该脚本将检查 /database 是否为空(新容器安装的空数据库)并复制在启动数据库守护程序之前将文件从临时文件夹返回到 /database。
    猜你喜欢
    • 2019-12-21
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2021-12-08
    • 2020-10-02
    • 2020-04-29
    相关资源
    最近更新 更多