首页 > 解决方案 > Docker、Rails、Postgres - 找不到数据库服务错误

问题描述

Dockerfile

FROM ruby:2.6.3
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /paper_scammer_docker
WORKDIR /paper_scammer_docker
COPY Gemfile /paper_scammer_docker/Gemfile
COPY Gemfile.lock /paper_scammer_docker/Gemfile.lock
RUN bundle install
COPY . /paper_scammer_docker

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

码头工人-compose.yml

version: '3'
services:
  db:
    image: postgres:10
    ports:
      - "5432:5432"
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/paper_scammer_docker
    ports:
      - "3000:3000"
    links:
      - "db:db"
    depends_on:
      - db

我可以使用以下命令成功构建映像

docker-compose build

如果我docker-compose up在项目根目录中执行此操作,我的应用程序运行良好,我可以看到两个容器,一个用于我的 rails 应用程序,另一个用于 postgres docker container ls。我观察到 postgres 图像是从库中加载的。

数据库.yml 文件

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  host: db
  username: postgres
  password:
  # user: gnpsllco_papaer
  # password: sharma@123

development:
  <<: *default
  database: paper_scammer_development
  # user: postgres
  # password: sharma@123

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: paper_scammer_test
  # user: postgres
  # password: sharma@123

production:
  <<: *default
  database: gnpsllco_paper_scammer

问题

我运行以下命令从我的 rails 应用程序的映像启动 docker 容器。

sudo docker run -p 3000:3000 paperscammer_web

postgres 容器未运行或丢失。

我想了解这个dockerfile-compose如何处理这个问题,当我旋转rails应用程序的图像时,它说它依赖于postgres服务,它不应该也旋转一个postgres容器并将'db'设置为连接主机。

还是需要为 postgres 手动旋转。

运行http://localhost:3000时出现以下错误

could not translate host name "db" to address: Name or service not known

我可以看到 postgres 容器没有运行。

谢谢

标签: ruby-on-railsdockerdocker-composedockerfile

解决方案


sudo docker run -p 3000:3000 paperscammer_web将仅启动 Web 服务器,您需要运行docker-compose

sudo docker-compose up -d --build

第二种选择:

 sudo docker run --name db -p 5432:5432 -v ./tmp/db:/var/lib/postgresql/data postgres:10
 sudo docker run -p 3000:3000 --link db:db -v .:/paper_scammer_docker paperscammer_web

推荐阅读