3

我的docker-compose文件中有一个使用postgres' 图像的主要服务,虽然我似乎成功连接到数据库,但我写入它的数据并没有保存在容器的生命周期之外(我所做的是基于本教程)。

这是我的docker-compose文件:

main:
  build: .
  volumes:
    - .:/code
  links:
    - postgresdb
  command: python manage.py insert_into_database
  environment:
    - DEBUG=true


postgresdb:
  build: utils/sql/
  volumes_from:
    - postgresdbdata
  ports:
    - "5432"
  environment:
    - DEBUG=true


postgresdbdata:
  build: utils/sql/
  volumes:
    - /var/lib/postgresql
  command: true
  environment:
    - DEBUG=true

这是我用于postgresdbpostgresdbdata服务的 Dockerfile(它本质上创建了数据库并添加了一个用户):

FROM postgres

ADD make-db.sh /docker-entrypoint-initdb.d/

如何在main服务完成运行后保留数据,以便将来能够使用它(例如当我调用类似的东西时python manage.py retrieve_from_database)?甚至是/var/lib/postgresql正确的目录,并且可以boot2docker访问它,因为它显然仅限于/Users/?

谢谢!

4

1 回答 1

6

问题是 Compose每次重新启动时都会创建一个版本的容器,因此旧容器及其数据会丢失。postgresdbdata

第二个问题是您的数据容器实际上不应该运行。数据容器实际上只是可以使用 导入的卷的命名空间--volumes-from,它仍然适用于停止的容器。

目前最好的解决方案是将postgresdbdata容器从 Compose 配置中取出。执行以下操作:

$ docker run --name postgresdbdata postgresdb echo "Postgres data container"
Postgres data container

echo 命令将运行并且容器将退出,但只要不退出,docker rm您仍然可以在其中引用它,--volumes-from并且您的 Compose 应用程序应该可以正常工作。

于 2015-04-24T17:57:56.597 回答