数据库未持久化 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
容器中的预期位置
我知道我在这里遗漏了一些非常基本的东西。我已经看到一些关于使用 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