我们需要创建一个也安装了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 =>
我尝试诊断的问题:
当我第一次进入交互式shell会话时,我输入
env > /tmp/env1.txt
然后输入bash
并运行
env > /tmp/env2.txt
当我diff
文件时,除了变量,它们实际上是相同的:
SHLVL=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脚本
答案 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
命令。