DRing
DRing

Reputation: 7039

Docker Rails app with searchkick/elasticsearch

Im porting my rails app from my local machine into a docker container and running into an issue with elasticsearch/searchkick. I can get it working temporarily but Im wondering if there is a better way. So basically the port for elasticsearch isnt matching up with the default localhost:9200 that searchkick uses. Now I have used "docker inspect" on the elasticsearch container and got the actual IP and then set the ENV['ELASTICSEARCH_URL'] variable like the searchkick docs say and it works. The problem Im having is that is a pain if I restart/change the containers the IP changes sometimes and I have to go through the whole process again. Here is my docker-compose.yml:

version: '2'
services:
  web:
    build: .
    command: rails server -p 3000 -b '0.0.0.0'
    volumes:
      - .:/living-recipe
    ports:
      - '3000:3000'
    env_file:
      - .env
    depends_on:
      - postgres
      - elasticsearch

  postgres:
    image: postgres

  elasticsearch:
    image: elasticsearch

Upvotes: 5

Views: 1860

Answers (3)

przbadu
przbadu

Reputation: 6049

Here is the docker-compose.yml that is working for me

docker compose will expose the container vaia it's name, so you can set ELASTICSEARCH_URL: http://elasticsearch:9200 ENV variable in your rails application container

version: "3"
services:
  db:
    image: postgres:9.6
    restart: always
    volumes:
      - /tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
    volumes:
      - .:/app
    ports:
      - 9200:9200
    environment:
      - discovery.type=single-node
    ulimits:
      memlock:
        soft: -1
        hard: -1
  api:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - ".:/app"
    ports:
      - "3001:3000"
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_PASSWORD: password
      ELASTICSEARCH_URL: http://elasticsearch:9200

Upvotes: 1

phoet
phoet

Reputation: 18845

use elasticsearch:9200 instead of localhost:9200. docker compose exposes the container via it's name.

Upvotes: 9

DevOps Dan
DevOps Dan

Reputation: 1853

You don't want to try to map the IP address for elasticsearch manually, as it will change.

Swap out depends_on for links. This will create the same dependency, but also allows the containers to be reached via service name.

Containers for the linked service will be reachable at a hostname identical to the alias, or the service name if no alias was specified.

Links also express dependency between services in the same way as depends_on, so they determine the order of service startup.

Docker Compose File Reference - Links

Then in your rails app where you're setting ENV['ELASTICSEARCH_URL'], use elasticsearch instead.

Upvotes: 0

Related Questions