Docker 容器中的 DB2。重新启动 Docker 容器后自动启动 SSL 配置的问题

DB2 in Docker container. Problem with autostart of SSL configuration after restarting of Docker container

我有一个 docker 容器,它从图像开始 – https://hub.docker.com/r/ibmcom/db2/

一切正常,但我需要对 SSL 连接进行一些实验。我进入了集装箱内。

docker exec -it my_container /bin/bash

我已经切换到需要的用户

su - db2inst1

并且我进行了更改,以实现 SSL 配置

gsk8capicmd_64 -keydb -create -db "server.kdb" -pw "my_secret_password" -stash
gsk8capicmd_64 -cert -create -db "server.kdb" -pw "my_secret_password" -label "my_company" -dn "CN=my_company" -size 2048 -sigalg SHA256_WITH_RSA
gsk8capicmd_64 -cert -extract -db "server.kdb" -pw "my_secret_password" -label "my_company" -target "server.arm" -format ascii -fips
gsk8capicmd_64 -cert -details -db "server.kdb" -pw "my_secret_password" -label "my_company"
db2 update dbm cfg using SSL_SVR_KEYDB /database/config/db2inst1/server.kdb
db2 update dbm cfg using SSL_SVR_STASH /database/config/db2inst1/server.sth
db2 update dbm cfg using SSL_SVCENAME 50002
db2set DB2COMM=SSL,TCPIP
db2stop force
db2start

让我们检查一下

netstat -nlp

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:50000           0.0.0.0:*               LISTEN      17030/db2sysc 0
tcp        0      0 0.0.0.0:50002           0.0.0.0:*               LISTEN      17030/db2sysc 0

一切正常。我测试了 SSL,一切正常。但是之后,当我制作

docker stop my_container 
docker start my_container 

我的 SSL 端口未启动。在 netstat 中,我只看到:

netstat -nlp

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:50000           0.0.0.0:*               LISTEN      17030/db2sysc 0

当我去 docker 容器时,当我正在制作时

db2set DB2COMM=SSL,TCPIP
db2stop force
db2start

SSL 端口已打开,一切正常。

问题。我应该自动启动上面的命令吗?或者它可以通过 DB2 中的一些配置来实现?

暂时处理这种情况的一种方法是修改: /database/config/db2inst1/sqllib/profile.env 并在该文本文件中将 DB2COMM 变量的设置从 'TCPIP' 更改为 'TCPIP,SSL'(或任何您需要的设置)。

但是,这只会在容器存在时持续存在。

因此,如果您移除容器,则需要重做。

如果您只是停止并启动容器,更改将持续存在。

要使更改永久保留,您需要更改图像(或制作新图像)以便文件具有您需要的值。可能有更优雅的解决方案。要修改图像,请查看 构建您自己的 部分中的说明 here

我找到了正在重写 profile.env
的文件 此文件 /var/db2_setup/include/db2_common_functions,其中此字符串:

su - ${DB2INSTANCE?} -c ". sqllib/db2profile; db2set DB2COMM=TCPIP && db2 UPDATE DBM CFG USING DFTDBPATH $DATA_DIR IMMEDIATE"

我已经替换了这个:

su - ${DB2INSTANCE?} -c ". sqllib/db2profile; db2set DB2COMM='TCPIP,SSL' && db2 UPDATE DBM CFG USING DFTDBPATH $DATA_DIR IMMEDIATE"