无法使用Docker连接到Postgres数据库

时间:2020-02-07 05:44:35

标签: ruby-on-rails postgresql docker

我正在使用docker运行rails + Redis + Postgres,并且我终于设法使所有工作正常进行,唯一我不知道的是数据库。看来,无论我为主机/用户名/密码输入什么,我总是以连接被拒绝

这是我的设置:

docker-compose.yml

version: '3.4'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - database
      - redis
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - gem_cache:/usr/local/bundle/gems
    env_file: .env
    environment:
      RAILS_ENV: development

  database:
    image: postgres:12.1
    volumes:
      - db_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      POSTGRES_USER: baopals
      POSTGRES_PASSWORD: baopals

  redis:
    image: redis:5.0.7

volumes:
  gem_cache:
  db_data:

networks:
  default:
    external:
      name: baopals-network

Dockerfile

FROM ruby:2.5.1-alpine

ENV BUNDLER_VERSION=1.16.1

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 \
      openssl \
      pkgconfig \
      postgresql-dev \
      python \
      tzdata \
      nodejs

RUN gem install bundler -v 1.16.1

WORKDIR /app

ADD vendor/gems/active_elastic_job-2.0.1 /app/vendor/gems/active_elastic_job-2.0.1

COPY Gemfile Gemfile.lock ./

RUN bundle config build.nokogiri --use-system-libraries

RUN bundle check || bundle install

COPY . ./

ENTRYPOINT ["./entrypoints/docker-entrypoint.sh"]

.env

DB_NAME=baopals_development
DB_USER=baopals
DB_PASSWORD=baopals
DB_HOST=localhost
REDIS_HOST=redis

database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: baopals_development
  username: baopals
  password: baopals
  host: localhost
  port: 5432

最后这是我最终遇到的错误

app_1       | PG::ConnectionBad (could not connect to server: Connection refused
app_1       |   Is the server running on host "localhost" (127.0.0.1) and accepting
app_1       |   TCP/IP connections on port 5432?
app_1       | could not connect to server: Address not available
app_1       |   Is the server running on host "localhost" (::1) and accepting
app_1       |   TCP/IP connections on port 5432?

我是docker的新手,所以不确定我是否只是在这里缺少明显的东西

2 个答案:

答案 0 :(得分:1)

使用Docker Compose,服务(容器)会自动获得与服务名称相同的主机名。对于您来说,Postgres服务的主机名是database,而不是localhost

请参见https://docs.docker.com/compose/networking/

答案 1 :(得分:0)

当您想通过docker连接到PostgreSQL服务器时,您必须以这种方式启动为postgresql创建的docker容器 sudo docker启动mysql-55-container