Ruby on rails docker compose连接到redis时出错+;西德基

Ruby on rails docker compose连接到redis时出错+;西德基,ruby-on-rails,docker,redis,sidekiq,Ruby On Rails,Docker,Redis,Sidekiq,我正试图用docker构建一个容器,但我无法连接sidekiq+redis,错误是说在127.0.0.1:6379(Errno::ECONNREFUSED),sidekiq似乎在尝试连接到localhost,但由于“理论上”我正在构建的redis+sidekiq+rails+postgres容器不在localhost中,它应该在redis图像中 我的docker-compose.yml文件如下: version: '3' services: postgres: image: pos

我正试图用docker构建一个容器,但我无法连接sidekiq+redis,错误是说在127.0.0.1:6379(Errno::ECONNREFUSED),sidekiq似乎在尝试连接到localhost,但由于“理论上”我正在构建的redis+sidekiq+rails+postgres容器不在localhost中,它应该在redis图像中

我的docker-compose.yml文件如下:

version: '3'

services:
  postgres:
    image: postgres:10.5
    volumes:
      - my_app-postgres:/var/lib/postgresql/data

  redis:
    image: redis:4.0.11
    volumes:
      - my_app-redis:/var/lib/redis/data

  web:
    build: .
    command: bundle exec rails server -p 3000 -b '0.0.0.0'
    ports:
      - '3000:3000'
    depends_on:
      - postgres
      - redis
    volumes:
      - .:/my_app
    env_file:
      - .env

  sidekiq:
    build: .
    command: bundle exec sidekiq -C config/sidekiq.yml
    volumes:
      - .:/my_app
    depends_on:
      - postgres
      - redis
    env_file:
      - .env

volumes:
  my_app-postgres:
  my_app-redis:
我在日志中看到的另一个有趣的“信息”是
使用redis选项{:url=>nil}启动Sidekiq 4.2.10
这个url可能是问题的原因


在我的开发环境中,应用程序运行良好,我尝试将我拥有的内容“dockerize”。我怎样才能做到这一点

默认情况下,sidekiq尝试连接到
127.0.0.1:6379
,但您的sidekiq与redis位于不同的容器中,因此您需要将sidekiq配置为使用
redis:6379
作为redis主机,例如,通过使用初始值设定项

 Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://redis:6379/12' }
 end
查看文档了解更多详细信息:


如果您计划稍后使用Kubernetes进行部署,则可以将所有容器放在一个pod中,然后它们就可以通过本地主机进行连接,因为同一Kubernetes pod中的容器共享网络空间。要直接在Kubernetes集群内的pod中编程,您可以使用我最近在GitHub上开源的工具DevSpace:创建两个初始值设定项文件:

i) redis.rb

ii)sidekiq.rb

Sidekiq.configure_server do |config|
  config.redis = { url:  "redis://#{ENV['REDIS_URL']}:#{ENV['REDIS_PORT']}/12" }
end

Sidekiq.configure_client do |config|
  config.redis = { url:  "redis://#{ENV['REDIS_URL']}:#{ENV['REDIS_PORT']}/12" }
end
全样本 ./Dockerfile

.env

./docker compose.yml

/sh/entrypoints/api entrypoint.sh

/sh/entrypoints/sidekiq entrypoint.sh

./config/database.yml

./.dockrignore

用法

构建和运行:
docker组装——构建-d

停止:
docker编写下一步


停止并删除图像和卷:
docker compose down--rmi all--volumes

最好在环境中设置URL,这样就不需要初始值设定项:
REDIS\u URL=redis://redis:6379 bundle exec sidekiq…
Sidekiq.configure_server do |config|
  config.redis = { url:  "redis://#{ENV['REDIS_URL']}:#{ENV['REDIS_PORT']}/12" }
end

Sidekiq.configure_client do |config|
  config.redis = { url:  "redis://#{ENV['REDIS_URL']}:#{ENV['REDIS_PORT']}/12" }
end
FROM ruby:2.6.3-alpine

ENV BUNDLER_VERSION=2.0.2

RUN apk add --update --no-cache \
      binutils-gold \
      build-base \
      curl \
      file \
      g++ \
      gcc \
      git \
      less \
      libstdc++ \
      libffi-dev \
      libc-dev \ 
      linux-headers \
      libxml2-dev \
      libxslt-dev \
      libgcrypt-dev \
      make \
      netcat-openbsd \
      nodejs \
      openssl \
      pkgconfig \
      postgresql-dev \
      python \
      tzdata \
      yarn 

ARG USER=root
ARG WORK_DIR_PATH=/home
RUN mkdir -p $WORK_DIR_PATH && chown -R $USER:$USER $WORK_DIR_PATH
WORKDIR $WORK_DIR_PATH

COPY Gemfile* ./
RUN gem install bundler
RUN bundle config build.nokogiri --use-system-libraries
RUN bundle check || bundle install 

COPY package.json yarn.lock ./
RUN yarn install --check-files

COPY . .
APP_NAME=api
APP_PORT=3100

ENV=production

DATABASE_NAME=rails_db
DATABASE_USER=batman
DATABASE_PASSWORD=super_pass_123
DATABASE_PORT=5342
DATABASE_HOST=api_db # must be equal to the name of the postgres service in docker-compose.yml

SECRET_KEY_BASE=your_secret_string

REDIS_HOST=redis # must be equal to the name of the redis service in docker-compose.yml
REDIS_PORT=6379
version: '3.7'
services:
  api: 
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ${APP_NAME}
    #restart: unless-stopped
    depends_on:     
      - api_db
      - redis
    ports: 
      - "${APP_PORT}:${APP_PORT}"
    volumes:
      - .:/app
      - gem_cache:/usr/local/bundle/gems
      - node_modules:/app/node_modules
    env_file: .env
    environment:
      RAILS_ENV: ${ENV}
    entrypoint: ./sh/entrypoints/api-entrypoint.sh

  api_db:
    image: postgres
    command: postgres -p ${DATABASE_PORT}
    ports:
      - "${DATABASE_PORT}:${DATABASE_PORT}"
    volumes:
      - db_data:/var/lib/postgresql/data
      - ./log/db:/logs
    environment:
      - POSTGRES_USER=${DATABASE_USER}
      - POSTGRES_PASSWORD=${DATABASE_PASSWORD}
      - POSTGRES_DB=${DATABASE_NAME}

  redis:
    image: redis
    ports:
      - "${REDIS_PORT}:${REDIS_PORT}"
    command: redis-server
    volumes:
      - redis:/data

  sidekiq:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - api_db
      - redis
    volumes:
      - .:/app
      - gem_cache:/usr/local/bundle/gems
      - node_modules:/app/node_modules
    env_file: .env
    environment:
      RAILS_ENV: ${ENV}
      ENABLE_BOOTSNAP: 'false'
    entrypoint: ./sh/entrypoints/sidekiq-entrypoint.sh

volumes:
  redis:
  gem_cache:
  db_data:
  node_modules:
#!/bin/sh

DB_INITED=0
if db_version=$(bundle exec rake db:version 2>/dev/null)
then
    if [ "$db_version" = "Current version: 0" ]
    then
        echo "DB is empty"
    else
        echo "DB exists"
        DB_INITED=1
    fi
    bundle exec rake db:migrate 
else
    echo "DB does not exist"
    bundle exec rake db:setup
fi

if [ $DB_INITED == 0 ]
then
    echo "Performing initial configuration"
    # init some plugins, updated db if need, add initial data
fi

bundle exec rails assets:precompile
bundle exec rails s -b 0.0.0.0 -p $APP_PORT
#!/bin/sh

set -e

if [ -f tmp/pids/server.pid ]; then
  rm tmp/pids/server.pid
fi

bundle exec sidekiq
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  database: <%= ENV['DATABASE_NAME'] %>
  username: <%= ENV['DATABASE_USER'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  port: <%= ENV['DATABASE_PORT'] || '5432' %>
  host: <%= ENV['DATABASE_HOST'] %>

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
  secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>
Sidekiq.configure_server do |config|
  config.redis = { :url => "redis://#{ENV['REDIS_HOST']}:#{ENV['REDIS_PORT']}/" }
end

Sidekiq.configure_client do |config|
  config.redis = { :url => "redis://#{ENV['REDIS_HOST']}:#{ENV['REDIS_PORT']}/" }
end
.git
.gitignore
README.md

#
# OS X
#
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear on external disk
.Spotlight-V100
.Trashes
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

#
# Rails
#
.env
.env.sample
*.rbc
capybara-*.html
log
tmp
db/*.sqlite3
db/*.sqlite3-journal
public/system
coverage/
spec/tmp
**.orig

.bundle

.ruby-version
.ruby-gemset

.rvmrc

# if using bower-rails ignore default bower_components path bower.json files
vendor/assets/bower_components
*.bowerrc
bower.json

# Logs
logs
*.log

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules

server/*.spec.js
kubernetes