数据库不存在于docker中

时间:2016-07-01 19:23:34

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

我知道我遗漏了一些非常基本的东西。我已经看到了一些关于使用docker保存数据的旧问题,但我想我正在关注最新的here文档。 我有一个rails应用程序,我试图在docker中运行。它运行正常,但每次我启动时都会得到ActiveRecord::NoDatabaseError。在我创建数据库并迁移它之后,应用程序运行正常,直到我关闭它并重新启动它。

这是我的泊坞文件:

FROM ruby:2.3.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
ENV RAILS_ROOT /ourlatitude
RUN mkdir -p $RAILS_ROOT/tmp/pids
WORKDIR $RAILS_ROOT
COPY Gemfile Gemfile     
COPY Gemfile.lock Gemfile.lock
RUN gem install bundler     
RUN bundle install
COPY . .

这是我的docker-compose.yml文件

version: '2'
services:
  db:
    image: postgres:9.4.5
  app:
    build: .
    environment:
      RAILS_ENV: $RAILS_ENV
  ports:
    - "3000:3000"
  command: bundle exec rails s -b 0.0.0.0
  volumes:
    - .:/ourlatitude/database
  depends_on:
    - db

我遵循的基本流程是:

export RAILS_ENV=development
docker-compose build
docker-compose up
docker-compose run app rake db:create
docker-compose run app rake db:migrate

此时应用程序将正常运行

然后我这样做

docker-compose down
docker-compose up

然后我回到ActiveRecord::NoDatabaseError

正如我所说,我认为我遗漏了一些非常基本的东西。

2 个答案:

答案 0 :(得分:3)

看起来你没有将你的postgres放在一个卷上,你可能在app容器中缺少其他持久性数据源,看起来你错过了app容器定义上的一些缩进。

version: '2'
services:
  db:
    image: postgres:9.4.5
    volumes:
      - postgres-data:/var/lib/postgresql/data
  app:
    build: .
    environment:
      RAILS_ENV: $RAILS_ENV
    ports:
      - "3000:3000"
    command: bundle exec rails s -b 0.0.0.0
    volumes:
      - .:/ourlatitude/database
    depends_on:
      - db
volumes:
  postgres-data:
    driver: local

在上面的示例中,postgres数据存储在指定的卷中。有关为该应用程序保留数据的更多详细信息,请参阅docker hub上的建议。如果您仍在丢失数据,请检查容器上docker diff $container_id的输出,以查看哪些文件在您的卷之外发生了变化,这些文件将在向下/向上丢失。

答案 1 :(得分:0)

我设法使用以下docker-compose.yml文件使其正常工作。

version: '2'
volumes:
  postgres-data:
services:
  db:
    image: postgres:9.4.5
    volumes:
      - postgres-data:/var/lib/postgresql/data
  app:
    build: .
    environment:
      RAILS_ENV: $RAILS_ENV
    ports:
      - "3000:3000"
    command: bundle exec rails s -b 0.0.0.0
    depends_on:
      - db

关键是要添加

volumes:
  postgres-data:

创建命名卷,然后创建

volumes:
  - postgres-data:/var/lib/postgresql/data

在db部分下,它将命名卷映射到容器/var/lib/postgresql/data

中的预期位置