数据库不会在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部分下