我的Jenkins流水线使用docker插件,然后从里面运行一个docker容器,建立一个一般的测试环境,像这样。
node('docker') {
sh """
cat > .Dockerfile.build <<EOF
FROM ruby:$rubyVersion
RUN apt-get update && apt-get install -y locales && localedef -i en_US -f UTF-8 en_US.UTF-8
ENV LANG=en_US.UTF-8 \\
LANGUAGE=en_US:en \\
LC_LANG=en_US.UTF-8 \\
LC_ALL=en_US.UTF-8
RUN \\
curl -sSL -o /tmp/docker.tgz https://download.docker.com/linux/static/stable/x86_64/docker-${dockerVersion}.tgz && \\
tar --strip-components 1 --directory /usr/local/bin/ --extract --file /tmp/docker.tgz
RUN \\
groupadd -g $gid docker && \\
useradd -d $env.HOME -u $uid build -r -m && \\
usermod -a -G docker build
EOF
""".stripIndent().trim()
}
一旦测试环境容器建立起来,我就会运行另一个容器,里面有我的代码和测试,在之前做的环境容器里面。我的一个测试包括确保通过iptables设置了一个防火墙,允许某些端口通过。为了测试我的防火墙是否设置正确,我在那个容器(现在有3个docker容器深)里面简单地运行这个。
def listener_response(port, host = 'localhost')
TCPSocket.open(host, port) do |socket|
socket.read(2)
end
rescue SystemCallError
nil
end
通过简单地传入我使用的随机端口和Jenkins docker节点的IP来调用这个程序。当我运行我的测试容器时,我做了这样的事情。
docker run -d -e DOCKER_HOST_IP=10.x.x.x -e RANDOM_OPEN_PORT=52459 -p 52459:52459 -v /var/run/docker.sock:/var/run/docker.sock
然而,我的测试仍然得到一个nil的响应,而不是一个OK。有没有办法从Jenkins主机到我的测试环境到我的测试容器的端口转发?
使用选项运行测试环境 --network host
似乎为我解决了这个问题。