ruby - 无法从 Docker 容器内连接到 Redis (Redis::CannotConnectError)

标签 ruby docker jenkins redis

我有一个 Jenkins 管道,它在 Docker 容器内运行 Sinatra 应用程序的所有测试。

这是管道的样子:

#!/usr/bin/env groovy

pipeline {

    agent {
        docker {
            image 'ruby'
            args '-u root -v /root/.ssh:/root/.ssh'
        }
    }

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
                sh 'bundle install'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                sh 'rspec spec'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploy...'
                sh 'cap staging deploy'
            }
        }
    }
}

Sinatra 应用程序使用 Redis,我似乎无法从运行测试的 Docker 中连接到 Redis。 Redis 数据库在可访问的不同远程服务器上运行。

我正在使用 redis-rb 和以下代码来访问 Redis:

REDIS_DB = Redis.new(url: 'redis://:strongpassword123@server_ip:6379')

但测试返回以下错误:

Redis::CannotConnectError:
       Error connecting to Redis on server_ip:6379 (Redis::TimeoutError)
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:344:in `rescue in establish_connection'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:329:in `establish_connection'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:99:in `block in connect'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:291:in `with_reconnect'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:98:in `connect'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:363:in `ensure_connected'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:219:in `block in process'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:304:in `logging'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:218:in `process'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis/client.rb:118:in `call'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis.rb:877:in `block in get'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis.rb:45:in `block in synchronize'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis.rb:45:in `synchronize'
     # /usr/local/bundle/gems/redis-4.0.0/lib/redis.rb:876:in `get'

我试过使用本地 Redis 服务器,但这也没有帮助。

我做错了什么?

最佳答案

Docker 容器的 IP 172.17.0.2。因为我启用了 UFW(防火墙),所以我必须添加一条规则,允许 Docker 连接到端口 6379 上的 Redis。

这样做 sudo ufw allow from 172.17.0.2 to any port 6379 解决了这个问题。

关于ruby - 无法从 Docker 容器内连接到 Redis (Redis::CannotConnectError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46436780/

相关文章:

java - Jenkins 拉取请求插件抛出 ArrayIndexOutOfBoundsException 异常

ruby-on-rails - 来自 Rails 4 中 Controller 的带有 html_safe 的 Flash 消息(安全版本)

docker - 用./configure配置了一个下载的包,如何从centos中彻底删除

ruby-on-rails - 谁能推荐一个好的轻量级 Rails CMS?

Docker Tomcat 用户配置不起作用

docker - 从 Windows 卸载 docker - Docker 工具箱

java - Jenkins 在 Maven 构建期间使用依赖项中的 LOG4j 配置而不是我的配置

jenkins - 在 Jenkinsfile 中执行 "Publish TestNG results"步骤

ruby-on-rails - 为不使用 Mechanize/Ruby 表单的站点输入登录信息

ruby - 如何测试一个字符串是否只包含给定集合中的字符?