数据库不会在docker中持久化

我知道我错过了这里非常基本的东西。 我已经看到了一些关于使用docker保存数据的老问题,但是我想我正在关注这里find的最新文档。 我有一个rails应用程序,我试图在docker中运行。 它运行良好,但每次我启动它,我得到ActiveRecord::NoDatabaseError 。 在创build数据库并迁移之后,应用程序运行良好,直到closures并重新启动它。

这里是我的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 

我所遵循的基本stream程是这样的:

 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上的build议。 如果仍然丢失数据,请检查docker diff $container_id上的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: 

创build指定的卷,然后

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

在将该命名卷映射到/var/lib/postgresql/data容器中的预期位置的db部分下