Techioz Blog

「127.0.0.1」のサーバーへの Rails docker-compose ファイル接続、ポート 5432 が失敗しました

概要

私は現在、Docker Compose を使用して Docker 化された Web アプリケーションに取り組んでいます。 docker-compose.yml ファイルには、db と api という 2 つのサービスが定義されています。db は PostgreSQL コンテナー、api は Rails アプリケーションです。ただし、Rails アプリケーションから PostgreSQL サーバーに接続しようとすると、エラーが発生します。

.env

POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_HOST=127.0.0.1
POSTGRES_DB=postgres

docker-compose.yml

version: "3.9"

x-app: &app
  env_file:
    - .env
  stdin_open: true
  tty: true

services:
  db:
    <<: *app
    image: postgres:16.2
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      DATABASE_URL: "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:5432/${POSTGRES_DB}"
    ports:
      - 5432:5432

  api:
    <<: *app
    build: .
    command: sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
      - bundle-cache:/usr/local/bundle
      - node_modules:/app/node_modules
    ports:
      - 3000:3000
    depends_on:
      - db

volumes:
  bundle-cache: null
  pg-data: null
  node_modules:

Dockerfile

FROM ruby:3.2.3-alpine
RUN apk update --no-cache && apk add build-base tzdata nodejs libpq-dev postgresql-client --no-cache
WORKDIR /app
COPY . ./
RUN bundle install

EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

Rails アプリケーションの DATABASE_URL 環境変数を「postgres://:@postgres:5432/」に更新しました。

解決策

この部分のようです:

    environment:
      DATABASE_URL: "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:5432/${POSTGRES_DB}"

APIサービス内にあるはずですよね?

また、POSTGRES_HOST は db (depends_on で使用した値) です。