数据库未持久化 docker

Database not persisting in docker

我知道我在这里遗漏了一些非常基本的东西。我已经看到一些关于使用 docker 持久化数据的较旧问题,但我认为我正在关注找到的最新文档 here。 我有一个 rails 应用程序,我正尝试在 docker 中 运行。它 运行 很好,但每次我启动它时我都会得到 ActiveRecord::NoDatabaseError。在我创建数据库并迁移它之后,应用程序 运行 一切正常,直到我将其关闭并重新启动。

这是我的 docker 文件:

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

正如我所说,我想我缺少一些非常基本的东西。

您似乎没有将 postgres 放在卷上,您的应用程序容器中可能缺少其他持久数据源,而且您似乎缺少应用程序容器定义中的一些缩进。

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 的输出,以查看哪些文件在您的卷之外发生变化,这些文件将在 down/up.

上丢失

我设法使用以下 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

容器中的预期位置