通过 Jenkins 上的嵌套 docker 容器进行端口转发
Port forwarding through nested docker containers on Jenkins
我的 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
但是,我的测试仍然没有得到响应,而不是 OK。有没有办法从 Jenkins 主机转发到我的测试环境到我的测试容器?
运行带有选项--network host
的测试环境似乎解决了我的问题。
我的 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
但是,我的测试仍然没有得到响应,而不是 OK。有没有办法从 Jenkins 主机转发到我的测试环境到我的测试容器?
运行带有选项--network host
的测试环境似乎解决了我的问题。