【问题标题】:Why docker-compose down deletes my volume? how to avoid this action done by 'down'. (Postgresql)为什么 docker-compose down 会删除我的卷?如何避免'down'完成的这个动作。 (PostgreSQL)
【发布时间】:2021-04-24 06:02:07
【问题描述】:

当我在没有-v--volumes 的情况下运行 docker-compose down 时,为什么我的数据会丢失? docker 会删除我的卷吗?
当我检查“docker volume inspect pgdata”时,它总是显示当前时间戳,看起来每次都重新创建。

但是当我刚刚停止 postgres 容器 docker stop containerid 并重新运行容器时,数据仍然存在。

version: '3.7'
services:
app:
container_name: bsf-quiz-app
image: sapkotasuren/bsf-quiz
ports:
- "443:8443"
depends_on:
- postgresqldb
postgresqldb:
image: postgres:latest
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_USER=postgres
- POSTGRES_DB=bsfQuiz

卷:
pgdata:

https://www.codepile.net/pile/YbkRvKEr

---2021 年 1 月 20 日更新------------
我尝试以绑定挂载方式执行此操作,我看到正在创建大量数据,但在 docker-compose down 和 up 之后,仍然无法找到我之前在数据库上创建的记录。

我还尝试使用 docker 命令创建命名卷:docker create volume postgres,并在我的 yaml 文件中提及它并将 external 设置为 true。还是一样的问题!

yaml 文件可以在这里找到:https://www.codepile.net/pile/MmbZkxmK

【问题讨论】:

    标签: postgresql docker docker-compose dockerfile


    【解决方案1】:

    docker-compose 的工作原理很简单。来自他们的documentation

    停止容器并移除由 up 创建的容器、网络、卷和映像。

    因此,命名卷是由 docker-compose up 创建的,因此当您关闭 compose 并再次启动它时,它将被删除。因此,为了保留这些卷,您可以选择将卷直接指向一个文件夹,这样它就不再由 up 命令创建,它是永久的。像这样:

    volumes:
    - /home/<username>/.pgdata:/var/lib/postgresql/data
    

    【讨论】:

    • 但是我尝试通过以下命令创建一个卷:docker create volume postgres 我在撰写文件上传递了这个 postgres 卷名并提到了 true 等。问题是,我仍然看不到我在“docker-compose down and up”之后的旧数据。我也尝试过你告诉我的方式,比如挂载到 /User/username/Desktop/folder:/var/lib/postgresql/data,我看到在这个文件夹上创建了一堆数据,但是在 docker-compose down 之后仍然是同样的问题和向上。如果您想在您的机器上尝试,我在下面附上了我的撰写文件。 codepile.net/pile/n4GRvVjR
    • 我不确定您的应用程序是做什么的,但不排除它可能会在每次启动时清理数据库。因此,我认为您可以尝试仅启动 postgresql 实例,使用 psql 或 PGAdmin 对您的数据库进行一些更改,向下编写并再次向上,然后使用 pgAdmin 进行仔细检查。我已经使用了很多时间,所以它应该可以工作。我也会在我的机器上尝试你的 docker-compose 文件,看看有什么问题。
    • 试过了,在我运行命令然后向上运行后它仍然存在。
    • 非常感谢,问题不在 docker-compose yaml 文件中,而是在我设置 spring.jpa.hibernate.ddl-auto = create it SHOULD NOT 的后端应用程序上创建但更新!通过创建它重新执行我的 sql 脚本,它将我的数据库带到空表中,它应该像这样:spring.jpa.hibernate.ddl-auto = update
    • 很高兴听到您解决了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2018-08-18
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多