Docker中的DB2客户端

时间:2018-11-13 15:11:53

标签: docker db2

我们需要创建一个也安装了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在容器中docker run -it之后可以访问db2 CLI,但是当我使用ENTRYPOINT cat /dev/null && /usr/bin/bash 却不能在初始会话中访问db2 CLI?

我们正在尝试将此容器用作其中具有db2客户机以连接到外部DB2数据库的可执行容器。我们不是要在容器中运行db2 DB。

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

docker run -it ContainerName

运行bash时DB2客户机可用,而不必立即键入docker run ContainerName

但是当我尝试将容器作为可执行文件ENTRYPOINT [] CMD ["/bin/bash"]

运行时,它不起作用

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

docker run ContainerName db2 list command options

当我将容器作为可执行文件docker run -it ContainerName运行时,如果我db2我没有立即输入bash的命令而没有键入npm install --save-dev @angular-devkit/build-angular的话,它现在可以工作了。这仍然是有问题的,因为该容器中将包含需要运行db2命令的shell脚本

1 个答案:

答案 0 :(得分:0)

更多搜索后,我发现了这篇文章: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命令。