我的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的目的是在多个平台上有一个一致的镜像,我有点纠结于如何开始故障排除/解决这个问题。
如有任何指导,将不胜感激。
1条答案
按热度按时间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有更多时间进行初始化...一个快速的--而且相当肮脏的!--解决方案可能是在入口点脚本中增加额外的等待时间:
不过,更好的方法是等待/检测数据库何时准备好接受连接,更好的方法是自动调整
systemd
单元文件,这样systemctl start gvmd
将一直等到数据库可用。