我知道我遗漏了一些非常基本的东西。我已经看到了一些关于使用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
正如我所说,我认为我遗漏了一些非常基本的东西。
答案 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