【问题标题】:Why isn't my PostgreSQL data persistent in Docker using volumes?为什么我的 PostgreSQL 数据不使用卷在 Docker 中持久化?
【发布时间】:2021-07-13 17:09:06
【问题描述】:

我目前正在学习如何使用 Flask、PostgreSQL 和 Docker,因为我正在尝试做一个 Web 应用程序。

我为开发阶段创建了两个容器:一个用于数据库,另一个用于 Web。我遇到的问题是,每当我停止并重新启动容器时,数据就不再存在了。

为了创建容器,我点击了以下链接:https://testdriven.io/blog/dockerizing-flask-with-postgres-gunicorn-and-nginx/#project-setup

我已经看到我可以创建一个卷来将数据保存在容器中,但它似乎不起作用,我真的不明白为什么。这是我的 docker-compose 文件:

version: '3.7'

services:
 web:
   build: ./services/web
   restart: always
   command: python manage.py run -h 0.0.0.0
   volumes:
     - ./services/web/:/usr/src/app/
     - ./migrations:/usr/src/app/migrations
   ports:
     - 5000:5000
   env_file:
     - ./dev.env
   depends_on:
     - db
 db:
   container_name: postgres
   restart: always
   image: postgres:latest
   volumes:
     - pgdata:/var/lib/postgresql/data
     - .:/usr/src/app #For refreshing the container if the code changes
   ports: 
     - 5432:5432
   environment:
     - POSTGRES_USER=hello_flask
     - POSTGRES_PASSWORD=hello_flask
     - POSTGRES_DB= hello_flask_dev #To change

volumes:
 pgdata:

我小心使用 docker-compose up -d,所以我没有删除任何卷,并且使用docker volume inspect 创建了以下卷:

[
    {
        "CreatedAt": "2021-04-19T13:19:05Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "hera_docker",
            "com.docker.compose.version": "1.29.0",
            "com.docker.compose.volume": "pgdata"
        },
        "Mountpoint": "/var/lib/docker/volumes/hera_docker_pgdata/_data",
        "Name": "hera_docker_pgdata",
        "Options": null,
        "Scope": "local"
    }
]

我想维护 docker-compose 命令,因为这两个容器一起在一个多容器中。

任何帮助都会有很大帮助。我在这个论坛上检查了一些其他问题,但我真的不知道发生了什么,我的不起作用。

提前致谢。

【问题讨论】:

  • 您能否确认当您运行您的应用程序时,Postgres 数据实际上是在您主机上的/var/lib/docker/volumes/hera_docker_pgdata/_data 中?我的意思是在停止之前据称可以清除它。
  • @MichalRosenbaum 抱歉,我没有收到您的评论通知。我真的不知道如何在我的计算机中查找该路线,但是每当我在网络中添加某些内容时,如果我执行 docker exec -it {container} psql -U hello_flask hello_flask_devshow data_directory; ,它就会出现我在 docker-compose 中放入 pgdata 的内容 /var/lib/postgresql/data .你是这个意思吗?

标签: postgresql docker docker-compose docker-volume persistent-storage


【解决方案1】:

好吧,在尝试和尝试几乎放弃之后,我找到了解决方案。如果它对某人有帮助,我会把它留在这里。 看来“web”应用程序正在覆盖数据库,解决方案是在 docker-compose 中将 web 中的 depends_on: db 更改为 db 中的 depends_on: web。现在,它看起来像这样:

version: '3.7'

services:
  web:
    build: ./services/web
    restart: always
    command: python manage.py run -h 0.0.0.0
    volumes:
      - ./services/web/:/usr/src/app/
    ports:
      - 5000:5000
    env_file:
      - ./dev.env
  db:
    container_name: postgres
    restart: always
    image: postgres:latest
    volumes:
      - "pgdata:/var/lib/postgresql/data"
      - .:/usr/src/app
    ports: 
      - 5432:5432
    environment:
      - POSTGRES_USER=hello_flask
      - POSTGRES_PASSWORD=hello_flask
      - POSTGRES_DB=hello_flask_dev
    depends_on:
      - web
volumes:
  pgdata:

pgdata:/var/lib/postgresql/data 更改为"pgdata:/var/lib/postgresql/data" 只是为了不在我的烧瓶目录中创建新文件夹。

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2018-04-19
    • 2019-06-17
    相关资源
    最近更新 更多