我们需要创建一个也安装了 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"
Run Code Online (Sandbox Code Playgroud)
图像构建正常,没有错误。
但是,当我尝试通过交互式 shell 命令运行并连接到容器时:
docker run -it --entrypoint=/bin/bash db2Container
Run Code Online (Sandbox Code Playgroud)
并尝试使用以下命令调用 db2 CLI
db2
Run Code Online (Sandbox Code Playgroud)
我收到错误:
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 =>
Run Code Online (Sandbox Code Playgroud)
我尝试诊断问题的事情:
当我第一次进入交互式 shell 会话时,我输入
env > /tmp/env1.txt
I 然后输入bash
并运行
env > /tmp/env2.txt
当我的diff
文件时,它们实际上是相同的,除了变量:
SHLVL=2
我知道这只是表明第二个 shell 是嵌套 shell
当我第一次进入交互式 shell 会话时,我输入
set > /tmp/set1.txt
I 然后输入bash
并运行
set > /tmp/set2.txt
当我的diff
文件时,它们几乎是相同的,除了SHLVL
变量再次
为什么在容器中后可以访问 db2 CLI bash
,但在使用后的初始会话中却无法访问docker run -it
?
我们尝试使用此容器作为可执行容器,其中包含 db2 客户端以连接到外部 DB2 数据库。我们并不是试图在容器中运行 db2 数据库。
我开始发现,我可能对 Dockerfile 中入口点的定义方式有疑问。使用:
ENTRYPOINT cat /dev/null && /usr/bin/bash
Run Code Online (Sandbox Code Playgroud)
当我运行时,DB2 客户端可用,docker run -it ContainerName
无需立即键入bash
但是当我尝试将容器作为可执行文件运行时它不起作用docker run ContainerName
我最接近的解决方案是对 Dockerfile 的修改:
ENTRYPOINT []
CMD ["/bin/bash"]
Run Code Online (Sandbox Code Playgroud)
当我将容器作为可执行文件运行时,docker run ContainerName db2 list command options
它可以工作,但是现在如果我不输入一次就无法docker run -it ContainerName
立即获得可用的命令。这仍然是有问题的,因为该容器中将包含需要能够运行 db2 命令的 shell 脚本db2
bash
经过更多谷歌搜索后,我找到了这篇文章:https ://engineeringblog.yelp.com/2016/01/dumb-init-an-init-for-docker.html
使用他们的Github 页面示例,我用以下内容更新了 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
Run Code Online (Sandbox Code Playgroud)
并且还更新了我们的 Dockerfile 的入口点:
ENTRYPOINT ["/usr/local/bin/dumb-init", "--"]
CMD ["/bin/bash"]
Run Code Online (Sandbox Code Playgroud)
结果是,当 docker 容器作为可执行文件调用时,位于容器内部的虚拟 shell 脚本(其中包含 db2 命令)可以正常工作:
docker run myContainer /scripts/dummyDB2connect.sh
Run Code Online (Sandbox Code Playgroud)
我还可以交互地启动并连接到容器来运行 db2 命令,而无需键入额外的bash
命令。
归档时间: |
|
查看次数: |
5913 次 |
最近记录: |