【问题标题】:DB2 Client in DockerDocker 中的 DB2 客户端
【发布时间】:2018-11-15 22:56:34
【问题描述】:

我们需要创建一个安装了 db2 客户端的 docker 容器。该容器还将包含一些使用 db2 客户端的 shell 脚本。

我们获取一个基本的 Cent OS 映像,然后通过 RUN 命令添加 db2:

COPY  db2rtcl_nr.rsp /db2install/
RUN cd /db2install && curl -o ibm_data_server_runtime_client_linuxx64_v11.1.tar.gz http://public_file_server.com/downloads/appTools/installs/db2/ibm_data_server_runtime_client_linuxx64_v11.1.tar.gz && \
tar -xvf ibm_data_server_runtime_client_linuxx64_v11.1.tar.gz && \
rm -f ibm_data_server_runtime_client_linuxx64_v11.1.tar.gz && \
rtcl/db2setup -u db2rtcl_nr.rsp -f sysreq && \

chown -R 1000:1000 /opt/ibm/db2/V11.1

ENV PATH="$PATH:/opt/ibm/db2/V11.1/bin"

图像构建正常,没有错误。

但是,当我尝试通过交互式 shell 命令运行并连接到容器时:

docker run -it --entrypoint=/bin/bash db2Container

并尝试使用

调用 db2 CLI
db2

我得到错误:

DB21018E 发生系统错误。命令行处理器无法 继续处理。

令人困惑的是,如果我立即运行 bash shell,然后调用 db2 CLI,它会起作用:

bash
db2
(c) Copyright IBM Corporation 1993,2007
Command Line Processor for DB2 Client 11.1.0

You can issue database manager commands and SQL statements from the command
prompt. For example:
db2 => connect to sample
db2 => bind sample.bnd

For general help, type: ?.
For command help, type: ? command, where command can be
the first few keywords of a database manager command. For example:
 ? CATALOG DATABASE for help on the CATALOG DATABASE command
 ? CATALOG          for help on all of the CATALOG commands.

To exit db2 interactive mode, type QUIT at the command prompt. Outside
interactive mode, all commands must be prefixed with 'db2'.
To list the current command option settings, type LIST COMMAND OPTIONS.

For more detailed help, refer to the Online Reference Manual.

db2 =>

我尝试诊断问题的方法:

  1. 当我第一次进入交互式 shell 会话时,我键入 env > /tmp/env1.txt 然后我输入bash 并运行 env > /tmp/env2.txt 当我diff 文件时,除了变量之外,它们几乎相同: SHLVL=2 我知道这只是表明第二个外壳是嵌套外壳

  2. 当我第一次进入交互式 shell 会话时,我键入 set > /tmp/set1.txt 然后我输入bash 并运行 set > /tmp/set2.txt 当我diff 文件时,除了SHLVL 变量之外,它们几乎完全相同

为什么我在容器中bash 之后可以访问db2 CLI,但在我使用docker run -it 的初始会话中却不能访问?

我们正在尝试将此容器用作其中包含 db2 客户端的可执行容器,以连接到外部 DB2 数据库。我们不会尝试在容器中运行 db2 DB。

我开始发现,在我们的 Dockerfile 中如何定义入口点可能存在问题。 使用:

ENTRYPOINT cat /dev/null && /usr/bin/bash

当我运行docker run -it ContainerName 时DB2 客户端可用,而无需立即输入bash

但是当我尝试将容器作为可执行文件运行时它不起作用docker run ContainerName

我最接近的解决方案是对 Dockerfile 的修改:

ENTRYPOINT []

CMD ["/bin/bash"]

当我将容器作为可执行文件docker run ContainerName db2 list command options 运行时,它现在可以工作,但是现在如果我docker run -it ContainerName 我没有立即使用db2 命令而不输入bash 一次。这仍然是个问题,因为这个容器中会包含需要能够运行 db2 命令的 shell 脚本

【问题讨论】:

  • 如果您在运行 CLP 之前 明确地在 db2profile 中添加点,是否会有所不同?如果是这样,则可能是错误的启动配置文件正在运行,或者该启动配置文件没有正确更新,或者没有正确运行。
  • @mao 当您说“db2profile 中的点”时,您的意思是来源它吗?
  • 如果用户 ID 的登录 shell 是 bash 或 ksh/ksh93,则 dot in 表示 csh 中的 source 等价物。在 linux 上默认安装当前 V11.1.3.3b 运行时客户端,使用 bash 作为配置的 shell,将使用 db2profile 命令中的相关点自动更新 .bashrc。
  • @bhamby 我不认为这与DB2 in Docker results in DB21018E 完全相同,因为他们似乎正在他们的容器中启动一个数据库并且需要保持它作为服务运行。而我试图使用这个容器对外部数据库执行一些 db2 客户端命令。

标签: docker db2


【解决方案1】:

经过一番谷歌搜索,我找到了这篇文章:https://engineeringblog.yelp.com/2016/01/dumb-init-an-init-for-docker.html

使用他们的Github page 示例,我更新了我们的 Dockerfile:

RUN wget -O /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_amd64
RUN chmod +x /usr/local/bin/dumb-init

并且还更新了我们的 Dockerfile 的入口点:

ENTRYPOINT ["/usr/local/bin/dumb-init", "--"]
CMD ["/bin/bash"]

结果是,当 docker 容器作为可执行文件调用时,位于容器内部的虚拟 shell 脚本(其中包含 db2 命令)可以正常工作:

docker run myContainer /scripts/dummyDB2connect.sh

而且我还可以交互地启动并连接到容器以运行 db2 命令,而无需输入额外的 bash 命令。

【讨论】:

  • 使用初始化工具作为初始入口点运行的附加实现:github.com/krallin/tini
  • 或者,如果我使用 --init 启动容器,这一切都可以解决,但为了不必记住总是输入我们将把愚蠢的 init 留在 ENTRYPOINT 中跨度>
  • 嗨@JuanD,我可以给你Dockerfile吗?
  • 嗨@JuanD,你能和我分享你的Dockerfile吗?或者分享这个项目的 github repo。谢谢。
猜你喜欢
  • 2017-07-05
  • 1970-01-01
  • 2021-05-03
  • 2016-02-21
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
相关资源
最近更新 更多