Search code examples
dockergoredis

Go backend to redis connection refused after docker compose up


I'm currently trying to introduce docker compose to my project. It includes a golang backend using the redis in-memory database.

version: "3.9"
services:
  frontend:
    ...
  backend:
    build:
      context: ./backend
    ports:
      - "8080:8080"
    environment:
      - NODE_ENV=production
    env_file:
      - ./backend/.env
  redis:
    image: "redis"
    ports:
      - "6379:6379"
FROM golang:1.16-alpine
RUN mkdir -p /usr/src/app
ENV PORT 8080
WORKDIR /usr/src/app
COPY go.mod /usr/src/app
COPY . /usr/src/app
RUN go build -o main .
EXPOSE 8080
CMD [ "./main" ]

The build runs successfully, but after starting the services, the go backend immediately exits throwing following error:

Error trying to ping redis: dial tcp 127.0.0.1:6379: connect: connection refused

Error being catched here:

_, err = client.Ping(ctx).Result()
if err != nil {
    log.Fatalf("Error trying to ping redis: %v", err)
}

How come the backend docker service isn't able to connect to redis? Important note: when the redis service is running and I start my backend manually using go run *.go, there's no error and the backend starts successfully.


Solution

  • When you run your Go application inside a docker container, the localhost IP 127.0.0.1 is referring to this container. You should use the hostname of your Redis container to connect from your Go container, so your connection string would be:

    redis://redis