完全相同的Docker映像,运行容器中的服务具有两种不同的行为

ktca8awb  于 2023-01-16  发布在  Docker
关注(0)|答案(1)|浏览(143)

我的entrypoint.sh文件看起来像这样:

root@e7ebb78ed443:/# cat /opt/entrypoint.sh
#!/bin/bash
cd /
systemctl start mosquitto.service
systemctl start notus-scanner
systemctl start postgresql@14-main
systemctl start redis-server@openvas.service
systemctl start ospd-openvas
systemctl start gvmd
systemctl start gsad
exec "$@"

只有当我使用systemctl start gvmd手动启动gvmd服务时,在执行www.example.com文件时已经运行的服务之上,它才能工作entrypoint.sh。
然而,我注意到在一个系统上,gvmd服务启动得很好,而在另一个系统上,gvmd服务没有启动,因为它在PostgreSQL上有一个致命的问题。
在第二个系统上检查gvmd的日志文件时,我看到:

md   main:MESSAGE:2023-01-12 21h05.46 utc:46:    Greenbone Vulnerability Manager version 22.4.0~dev1 (DB revision 250)
md manage:WARNING:2023-01-12 21h05.46 utc:47: sql_open: PQconnectPoll failed
md manage:WARNING:2023-01-12 21h05.46 utc:47: sql_open: PQerrorMessage (conn): connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  the database system is starting up
md manage:WARNING:2023-01-12 21h05.46 utc:47: init_manage_open_db: sql_open failed

但是,第一个系统显示了以下内容:

md   main:MESSAGE:2023-01-12 18h06.42 utc:52:    Greenbone Vulnerability Manager version 22.4.0~dev1 (DB revision 250)
md manage:   INFO:2023-01-12 18h06.46 UTC:72: osp_scanner_feed_version: No feed version available yet. OSPd OpenVAS is still starting
md manage:   INFO:2023-01-12 18h06.56 UTC:80: osp_scanner_feed_version: No feed version available yet. OSPd OpenVAS is still starting
md manage:   INFO:2023-01-12 18h07.06 UTC:84: osp_scanner_feed_version: No feed version available yet. OSPd OpenVAS is still starting

服务也运行良好。
有趣的是,这两个系统都运行Ubuntu 22.04.1 LTS和Docker版本20.10.21。映像完全相同,主机操作系统也相同,具有相同的服务/端口。
我在两个系统上都以如下方式运行docker:

docker run --privileged --rm --name openvas -ti <my_image> /bin/bash

镜像的sha 256在两个系统上是完全相同的,所以我甚至不知道从哪里开始故障排除。考虑到docker的目的是在多个平台上有一个一致的镜像,我有点纠结于如何开始故障排除/解决这个问题。
如有任何指导,将不胜感激。

zaqlnxep

zaqlnxep1#

请注意,相关错误消息为
管理员:警告:2023年1月12日21时05分46秒UTC:47:sql_open:参数错误消息(连接):在套接字“/var/run/postgresql/.s.PGSQL.5432”上连接到服务器失败:FATAL:数据库系统正在启动
也就是说,gvmd无法连接到PostgreSQL,因为数据库仍在启动,尚未准备好连接。
这也简单解释了为什么这可以在一个主机上工作,但不能在另一个具有完全相同映像的主机上工作。这是一种竞态条件!
这可能是因为在第一个系统上PostgreSQL启动得更快--由于数据库中的数据更少,初始化速度更快,或者由于硬盘驱动器更快--因此只要gvmd尝试连接,PostgreSQL就准备好了。gvmd启动较慢,使PostgreSQL有更多时间进行初始化...
一个快速的--而且相当肮脏的!--解决方案可能是在入口点脚本中增加额外的等待时间:

#!/bin/bash
cd /
systemctl start mosquitto.service
systemctl start notus-scanner
systemctl start postgresql@14-main
systemctl start redis-server@openvas.service
systemctl start ospd-openvas

# wait 10s to allow databases to be ready
sleep 10

systemctl start gvmd
systemctl start gsad
exec "$@"

不过,更好的方法是等待/检测数据库何时准备好接受连接,更好的方法是自动调整systemd单元文件,这样systemctl start gvmd将一直等到数据库可用。

相关问题