Мой конвейер 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
Это вызывается простым передачей случайного порта, который я использовал и IP-узел Jenkins docker. Когда я запускаю свой тестовый контейнер, я делаю что-то вроде:
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
Однако я все равно получаю нулевой ответ от моего теста, а не ОК. Есть ли способ перенести данные с хоста Jenkins в мою тестовую среду на мой тестовый контейнер?