使用docker卷保留数据库

时间:2017-01-12 01:05:42

标签: postgresql docker docker-compose

我试图在poster容器中保留postgres数据,这样一旦docker-compose down and docker-compose up -d你就不会丢失上次会话中的数据。我无法做任何事情 - 将容器拉下来并再次备份会定期删除数据。

这是我目前的docker-compose.yml:

version: '2'
services:
  api:
    build: .
    ports:
      - '8245:8245'
    volumes:
      - .:/home/app/api
      - /home/app/api/node_modules
      - /home/app/api/public/src/bower_components
    links:
      - db
  db:
    build: ./database
    env_file: .env
    ports:
      - '8246:5432'
    volumes_from:
      - dbdata

  dbdata:
    image: "postgres:9.5.2"
    volumes:
      - /var/lib/postgresql/data

帮助?

1 个答案:

答案 0 :(得分:8)

根据Dockment of Docker Compose,当您写下以下内容时:

volumes:
  - /var/lib/postgresql/data

它会创建一个新的docker卷并将其映射到容器内的/var/lib/postgresql/data。 因此,每次运行docker-compose updocker-compose down时,都会创建新卷。您可以使用docker volume ls确认行为。

为避免这种情况,您有两种选择:

(A)将主机目录映射到容器

您可以使用<HOST_PATH>:<CONTAINER_PATH>将主机目录映射到容器中。

volumes:
  - /path/to/your/host/directory:/var/lib/postgresql/data

postgresql的数据将保存到容器主机的/path/to/your/host/directory中。

(B)使用外部容器

docker-compose有一个external container选项。 当它设置为true时,它不会始终创建音量。 这是一个例子。

version: '2'
services:
  dbdata:
    image: postgres:9.5.2
    volumes:
      - mypostgresdb:/var/lib/postgresql/data
volumes:
  mypostgresdb:
    external: true

使用external: true,docker-compose不会创建mypostgredb卷,因此您必须使用以下命令自行创建:

docker volume create --name=mypostgredb

postgresql的数据将保存到名为mypostgredb的docker卷中。请阅读reference了解更多详情。