使用docker卷保留数据库

six*_*mes 4 postgresql docker docker-compose

我正在尝试将postgres数据保存在docker容器中,这样一旦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
Run Code Online (Sandbox Code Playgroud)

救命?

ymo*_*nad 8

根据Docker of Docker Compose,你写的东西如下:

volumes:
  - /var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)

它创建一个新的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
Run Code Online (Sandbox Code Playgroud)

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

(B)使用外部容器

docker-compose有一个外部容器选项.当它设置为true时,它不会始终创建音量.这是一个例子.

version: '2'
services:
  dbdata:
    image: postgres:9.5.2
    volumes:
      - mypostgresdb:/var/lib/postgresql/data
volumes:
  mypostgresdb:
    external: true
Run Code Online (Sandbox Code Playgroud)

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

docker volume create --name=mypostgredb
Run Code Online (Sandbox Code Playgroud)

postgresql的数据将保存到名为docker的卷中mypostgredb.阅读参考了解更多细节.