2016-08-29 13 views
5

tôi đang chạy ứng dụng của tôi sử dụng Docker-soạn với bên dưới tập tin ymllàm thế nào để tôi sao lưu cơ sở dữ liệu trong Docker

postgres: 
    container_name: postgres 
    image: postgres:${POSTGRES_VERSION} 
    volumes: 
     - postgresdata:/var/lib/postgresql/data 
    expose: 
     - "5432" 
    environment: 
     - POSTGRES_DB=42EXP 
     - POSTGRES_USER=${POSTGRES_USER} 
     - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} 

    node: 
    container_name: node 
    links: 
     - postgres:postgres 
    depends_on: 
     - postgres 

volumes: 
    postgresdata: 

Như bạn có thể thấy ở đây, tôi đang sử dụng một named volume để quản lý postgres nhà nước.

Theo các tài liệu chính thức, tôi có thể sao lưu một khối lượng như dưới đây

docker run --rm --volumes postgresdata:/var/lib/postgresql/data -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata 

Một số hướng dẫn khác đề nghị tôi sử dụng các chức năng được cung cấp bởi pg-dump postgres để sao lưu.

pg_dump -Fc database_name_here > database.bak 

Tôi đoán tôi sẽ phải vào bên trong vùng chứa postgres để thực hiện chức năng này và gắn thư mục sao lưu vào máy chủ lưu trữ.

Có một cách tiếp cận tốt hơn/thích hợp hơn phương pháp kia không?

Trả lời

25

Để chạy pg_dump bạn có thể sử dụng docker exec lệnh:

Để sao lưu:

docker exec -u <your_postgres_user> <postgres_container_name> pg_dump -Fc <database_name_here> > db.dump

Để thả db (Đừng làm điều đó trên sản xuất, chỉ nhằm mục đích thử nghiệm !! !):

docker exec -u <your_postgres_user> <postgres_container_name> psql -c 'DROP DATABASE <your_db_name>'

Để khôi phục:

docker exec -i -u <your_postgres_user> <postgres_container_name> pg_restore -C -d postgres < db.dump

Ngoài ra bạn có thể sử dụng analog Docker-soạn của exec. Trong trường hợp đó, bạn có thể sử dụng tên dịch vụ ngắn (postgres) thay vì tên vùng chứa đầy đủ (composeproject_postgres).

docker exec

docker-compose exec

pg_restore

+2

Khi tôi gọi Docker exec -u pg_restore C -d postgres Andi

+0

Tệ của tôi, bạn nên thêm tùy chọn --interactive cho docker exec. Tôi đã chỉnh sửa câu trả lời gốc để sửa lỗi này. – tck

+0

typo nhỏ: s/DATABSE/DATABASE/(cảm ơn câu trả lời ;-) –

Các vấn đề liên quan