docker-撰写:postgres 数据不持久
docker-compose: postgres data not persisting
我的 docker-compose
文件中有一个主要服务使用 postgres
的图像,虽然我似乎已成功连接到数据库,但我正在写入的数据不会超出容器的生命周期(我所做的是基于this tutorial)。
这是我的 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
这是我用于 postgresdb
和 postgresdbdata
服务的 Dockerfile(实质上是创建数据库并添加用户):
FROM postgres
ADD make-db.sh /docker-entrypoint-initdb.d/
如何在 main
服务完成后保留数据 运行,以便将来能够使用它(例如当我调用类似 python manage.py retrieve_from_database
)? /var/lib/postgresql
甚至是正确的目录吗?boot2docker
是否可以访问它,因为它显然仅限于 /Users/
?
谢谢!
问题在于 Compose 每次重新启动时都会创建 new 版本的 postgresdbdata
容器,因此旧容器及其数据会丢失。
第二个问题是您的数据容器实际上不应该 运行ning;数据容器实际上只是一个卷的命名空间,可以使用 --volumes-from
导入,它仍然适用于已停止的容器。
目前最好的解决方案是将 postgresdbdata
容器从 Compose 配置中移除。做类似的事情:
$ docker run --name postgresdbdata postgresdb echo "Postgres data container"
Postgres data container
echo 命令将 运行 并且容器将退出,但只要不 docker rm
它,您仍然可以在 --volumes-from
中引用它并且您的 Compose 应用程序应该可以正常工作。
我的 docker-compose
文件中有一个主要服务使用 postgres
的图像,虽然我似乎已成功连接到数据库,但我正在写入的数据不会超出容器的生命周期(我所做的是基于this tutorial)。
这是我的 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
这是我用于 postgresdb
和 postgresdbdata
服务的 Dockerfile(实质上是创建数据库并添加用户):
FROM postgres
ADD make-db.sh /docker-entrypoint-initdb.d/
如何在 main
服务完成后保留数据 运行,以便将来能够使用它(例如当我调用类似 python manage.py retrieve_from_database
)? /var/lib/postgresql
甚至是正确的目录吗?boot2docker
是否可以访问它,因为它显然仅限于 /Users/
?
谢谢!
问题在于 Compose 每次重新启动时都会创建 new 版本的 postgresdbdata
容器,因此旧容器及其数据会丢失。
第二个问题是您的数据容器实际上不应该 运行ning;数据容器实际上只是一个卷的命名空间,可以使用 --volumes-from
导入,它仍然适用于已停止的容器。
目前最好的解决方案是将 postgresdbdata
容器从 Compose 配置中移除。做类似的事情:
$ docker run --name postgresdbdata postgresdb echo "Postgres data container"
Postgres data container
echo 命令将 运行 并且容器将退出,但只要不 docker rm
它,您仍然可以在 --volumes-from
中引用它并且您的 Compose 应用程序应该可以正常工作。