You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker化Rails应用连接Elasticsearch失败求助

Docker化Rails应用连接Elasticsearch失败问题

按照教程在Docker化Rails应用中添加Elasticsearch实例,执行docker-compose build && docker-compose up无报错,但应用内调用Elasticsearch时出现以下错误:

Faraday::ConnectionFailed (Failed to open TCP connection to cap_es:9200 (getaddrinfo: Try again))

getaddrinfo: Try again

  • 尝试设置直接主机地址ELASTICSEARCH_URL=http://127.0.0.1:9200,得到错误:
Connection refused - connect(2) for "127.0.0.1" port 9200
  • 测试不同Ruby版本的情况:
    • 使用3.1.2时,先遇到SSL错误:
    OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 peeraddr=104.26.1.143:443 state=error: certificate verify failed (unable to get local issuer certificate))
    
    • 使用3.1.2-alpine时,出现类似的域名解析错误:
    getaddrinfo: name resolution is temporary unavailable
    
  • 执行数据库seed时,同样出现连接错误:
Caused by:
SocketError: Failed to open TCP connection to cap_es:9200 (getaddrinfo: Try again)

配置文件

docker-compose.yml

# docker-compose.yml
version: '3'
networks:
  development:
  test:
volumes:
  db_data:
  es_data:
  gem_cache:
  shared_data:
services:
  cap_redis:
    image: redis:7.0.5-alpine
    command: redis-server
    networks:
      - development
      - test
    volumes:
      - shared_data:/usr/share/redis
  cap_db:
    image: postgres:14.5-alpine
    container_name: cap_db
    volumes:
      - db_data:/var/lib/postgresql/data
      - shared_data:/usr/share
    networks:
      - development
      - test
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    ports:
      - 5432:5432
  cap_es:
    image: elasticsearch:8.4.2
    environment:
      - node.name=es01
      - cluster.initial_master_nodes=es01
      - cluster.name=cap_elastic_cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
      - xpack.monitoring.templates.enabled=false
      - xpack.graph.enabled=false
      - xpack.watcher.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es_data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
  cap_app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    container_name: cap_app
    volumes:
      - .:/var/app
      - shared_data:/usr/share
      - gem_cache:/usr/local/bundle/gems
    networks:
      - development
    ports:
      - 3000:3000
    stdin_open: true
    tty: true
    env_file: .env.development
    entrypoint: dev-entrypoint.sh
    command: [ 'bundle', 'exec', 'rails', 'server', '-p', '3000', '-b', '0.0.0.0' ]
    environment:
      RAILS_ENV: development
    depends_on:
      - cap_db
      - cap_es
  cap_test:
    image: cap_cap_app
    container_name: cap_test
    volumes:
      - .:/var/app
      - shared_data:/usr/share
      - gem_cache:/usr/local/bundle/gems
    networks:
      - test
    ports:
      - 3001:3000
    stdin_open: true
    tty: true
    env_file: .env.development
    entrypoint: test-entrypoint.sh
    command: [ 'bundle', 'exec', 'rails', '-v' ]
    environment:
      RAILS_ENV: test
    depends_on:
      - cap_db
      - cap_es
  guard:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/var/app
      - gem_cache:/usr/local/bundle/gems
    environment:
      RAILS_ENV: development
    command: [ 'bundle', 'exec', 'guard', '--no-bundler-warning', '--no-interactions' ]
    depends_on:
      - cap_app

Dockerfile.dev

# Dockerfile.dev
FROM ruby:3.1.2-alpine

ENV APP_PATH /var/app
ENV BUNDLE_VERSION 2.2.3
ENV BUNDLE_PATH /usr/local/bundle/gems
ENV TMP_PATH /tmp
ENV RAILS_LOG_TO_STDOUT true
ENV RAILS_PORT 3000

# Copy entrypoint scripts and grant execution permissions
COPY ./dev-docker-entrypoint.sh /usr/local/bin/dev-entrypoint.sh
COPY ./test-docker-entrypoint.sh /usr/local/bin/test-entrypoint.sh
RUN chmod +x /usr/local/bin/dev-entrypoint.sh && chmod +x /usr/local/bin/test-entrypoint.sh

# Install dependencies
RUN apk -U add --update --no-cache \
build-base \
git \
libpq-dev \
less \
nodejs \
postgresql-dev \
postgresql-client \
libxml2-dev \
libxslt-dev \
tzdata \
yarn \
&& rm -rf /var/cache/apk/* \
&& mkdir -p $APP_PATH

# Install bundler and clean cache
RUN gem install bundler --version "$BUNDLE_VERSION" \
&& rm -rf $GEM_HOME/cache/*

WORKDIR $APP_PATH
EXPOSE $RAILS_PORT

# ENTRYPOINT [ 'bundle', 'exec' ]

内容的提问来源于stack exchange,提问作者A2p0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:05:50