问题描述
在使用InSpec 2.1.10测试一个基于PostgreSQL容器时,遇到了一个问题:尽管Docker、netstat和psql都报告端口正确映射,但简单的端口检查却无法返回true。虽然这可能是InSpec的一个bug,但更有可能是用户自己遗漏了什么步骤。用户想要知道自己漏掉了什么。
重复测试
我的规范 (port_test.rb)
describe port(5432) do
it { should be_listening }
end
我的测试命令
container=$(docker run -d -P --rm postgres:alpine)
inspec exec port_test.rb -t docker://$container
我的输出
Profile: tests from test.rb (tests from test.rb)
Version: (not specified)
Target: docker://8caceaa7e2eefa4a2bf50a58ea1ddf9c927c08d3397e3d9ad5b60d3519971380
Port 5432 × should be listening
expected `Port 5432.listening?` to return true, got false
Test Summary: 0 successful, 1 failure, 0 skipped
但它应该正常工作!
除了InSpec之外,其他工具都报告事情正在按预期工作。
$ docker port $container
5432/tcp -> 0.0.0.0:32770
# 在容器内部使用netstat
$ docker exec $container netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN -
# 在macOS Docker宿主机上执行,flags等同于在Linux上执行的`-lntp`
$ netstat -anv | fgrep $(docker port $container | cut -d: -f2)
tcp6 0 0 ::1.32770 *.* LISTEN 131072 131072 709 0
tcp4 0 0 *.32770 *.* LISTEN 131072 131072 709 0
# 从主机连接到容器内的数据库
$ psql -h localhost -p $(docker port $container | cut -d: -f2)
psql (PostgreSQL) 10.3
解决方案
以下解决方案考虑版本和操作系统的差异,若遇到问题请参考相关文档或寻求支持。
在这个情况下,问题似乎出现在InSpec的netstat输出解析与Alpine容器的netstat输出组合上。以下是解决方案:
方案
在Alpine容器内安装iproute2
包,这可以通过以下命令完成:
apk add iproute2
然后,重新运行InSpec测试,这应该可以解决netstat输出解析的问题。
结论
问题是InSpec与Alpine的netstat输出之间的不兼容性。通过安装iproute2
包,你可以确保InSpec能够解析正确的netstat输出,从而在测试中正确检测端口是否被监听。
如果问题仍然存在,建议向InSpec团队报告此问题,以便他们进一步解决并修复这个bug。
正文完