【问题标题】:Rails docker postgres Connection refusedRails docker postgres 连接被拒绝
【发布时间】:2021-03-23 17:13:51
【问题描述】:

我正在尝试 dockerize 我的 Rails 应用程序,但是当我想使用 docker-compose 运行它时出现此错误:

! Unable to load application: PG::ConnectionBad: could not connect to server: Connection refused
    Is the server running on host "postgres" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?

我的 docker-compose 文件是:

version: '2'
services:
  web:
    build: .
    image: cda_app
    container_name: "cda_app_web"
    ports:
      - '127.0.0.1:${WEB_PORT}:3000'
    env_file: .env
    volumes:
      - gems:/gems
      - ./:/var/www/app
    logging:
      driver: 'json-file'
      options:
        max-size: '100m'
        max-file: '5'
    links:
      - redis
      - postgres
    entrypoint: 'bundle exec puma -C config/puma.rb'
  redis:
    image: 'redis'
    volumes:
      - redis:/data
      - redis_log:/var/log/redis
  postgres:
    image: 'postgres:12.4'
    volumes:
      - postgres:/var/lib/postgresql/data
      - postgres_log:/var/log/postgresql
volumes:
  gems:
  redis:
  redis_log:
  postgres:
  postgres_log:

Dockerfile:

ARG BASE_IMAGE=ruby:2.7.1
FROM $BASE_IMAGE

RUN apt-get update && \
  apt-get install -y \
    apt-utils \
    build-essential \
    cmake \
    curl \
    ghostscript \
    libmagic-dev \
    libpq-dev \
    openssh-client \
    rename \
  && rm -rf /var/lib/apt/lists/*

RUN curl -sL https://deb.nodesource.com/setup_12.x | bash && apt-get install -y nodejs
RUN npm install -g yarn

WORKDIR /var/www/app

RUN mkdir /gems
ENV BUNDLE_PATH=/gems
RUN gem install bundler

ARG BUNDLE_WITHOUT=development:test
COPY Gemfile Gemfile.lock ./
RUN bundle install --jobs $(nproc) --with BUNDLE_WITHOUT

COPY package.json yarn.lock ./
RUN yarn install --check-files --ignore-optional

COPY . .

RUN rename -f -v 's/\.sample//' config/*sample.yml

EXPOSE 3000

CMD ./bin/puma -b tcp://0.0.0.0:3000

我的数据库.yml:

default: &default
  pool: <%= ENV["DB_POOL"] %>
  template: 'template0'
  adapter: 'postgresql'
  database: <%= ENV["DB_NAME"] %>
  username: <%= ENV["DB_USER"] %>
  host: <%= ENV["DB_HOST"] %>
  port: <%= ENV["DB_PORT"] %>
  password: <%= ENV["DB_PASSWORD"] %>
  timeout: 5000
  encoding: 'utf8'
  min_messages: WARNING

development:
  <<: *default
  database: <%= ENV["DB_NAME"] %>_development

test:
  <<: *default
  database: <%= ENV["DB_NAME"] %>_test<%= ENV['TEST_ENV_NUMBER'] %>

production:
  <<: *default
  database: <%= ENV["DB_NAME"] %>_production

.env 文件:


DB_NAME=cda_database
DB_HOST=postgres
DB_USER=postgres
DB_PASSWORD=postgres
DB_PORT=5432
DB_POOL=5

我不明白我做错了什么?! 看来我做的一切都是正确的,但我得到了错误。 我正在使用数字海洋。此外,数据库在 docker 之外运行,但在 docker 中无法访问。

【问题讨论】:

    标签: ruby-on-rails ruby postgresql docker docker-compose


    【解决方案1】:

    你可以在 docker-compose 文件中试试。我希望它能工作

    postgres:
      image: 'postgres:12.4'
      volumes:
        - postgres:/var/lib/postgresql/data
        - postgres_log:/var/log/postgresql
      environment:
        - POSTGRES_USER= postgres
        - POSTGRES_PASSWORD= postgres
    

    【讨论】:

    • 感谢您的评论。不幸的是,这不是答案。我在 docker-compose 和 PostgreSQL 用户名和密码中添加了env_file: .env
    【解决方案2】:

    您可以在docker-compose.yml中为postgresql编写环境变量,例如:

    version: '2'
    services:
      web:
        build: .
        image: cda_app
        container_name: "cda_app_web"
        ports:
          - '127.0.0.1:${WEB_PORT}:3000'
        env_file: .env
        volumes:
          - gems:/gems
          - ./:/var/www/app
        logging:
          driver: 'json-file'
          options:
            max-size: '100m'
            max-file: '5'
        links:
          - redis
          - postgres
        entrypoint: 'bundle exec puma -C config/puma.rb'
      redis:
        image: 'redis'
        volumes:
          - redis:/data
          - redis_log:/var/log/redis
      postgres:
        image: 'postgres:12.4'
        volumes:
          - postgres:/var/lib/postgresql/data
          - postgres_log:/var/log/postgresql
      environment:
          POSTGRES_PASSWORD: "${DB_PASSWORD}"
          POSTGRES_USER: "${DB_USER}"
          POSTGRES_DB: "${DB_NAME}"
    
    volumes:
      gems:
      redis:
      redis_log:
      postgres:
      postgres_log:
    
    

    请注意,.env 文件必须与 docker-compose.yml 位于同一目录中

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 2021-10-12
      • 2020-09-08
      • 2019-01-02
      • 1970-01-01
      • 2019-11-12
      • 2021-05-26
      • 2021-04-24
      • 1970-01-01
      相关资源
      最近更新 更多