Vấn đề là các postgres Dockerfile tuyên bố "/ var/lib/postgresql/dữ liệu" như một khối lượng. Đây chỉ là một thư mục bình thường tồn tại bên ngoài Hệ thống tệp liên kết được sử dụng bởi hình ảnh. Âm lượng phát trực tiếp cho đến khi không có vùng chứa nào liên kết với chúng và chúng được xóa một cách rõ ràng.
Bạn có một vài lựa chọn:
- Sử dụng lệnh
--volumes-from
để chia sẻ dữ liệu với container mới. Điều này sẽ chỉ hoạt động nếu chỉ có một hình ảnh postgres đang chạy tại một thời điểm, nhưng đó là giải pháp tốt nhất.
- Viết Dockerfile của riêng bạn để tạo dữ liệu trước khi khai báo âm lượng. Dữ liệu này sau đó sẽ được sao chép vào ổ đĩa khi vùng chứa được tạo.
- Viết một điểm nhập cảnh hoặc tập lệnh cmd để điền cơ sở dữ liệu vào thời gian chạy.
Tất cả các đề xuất này yêu cầu bạn sử dụng Âm lượng để quản lý dữ liệu khi vùng chứa đang chạy. Ngoài ra, bạn có thể viết Dockerfile của riêng bạn và đơn giản là không khai báo một ổ đĩa. Sau đó, bạn có thể sử dụng docker commit
để tạo hình ảnh mới sau khi thêm dữ liệu. Điều này có thể sẽ hoạt động trong thời gian ngắn, nhưng chắc chắn không phải là cách bạn nên làm việc với các thùng chứa - nó không thể lặp lại và cuối cùng bạn sẽ hết các lớp trong Hệ thống Tệp Liên minh.
Hãy xem tài liệu Docker chính thức trên managing data in containers để biết thêm thông tin.
Nguồn
2014-12-09 12:08:23
Giả sử tôi muốn chạy một số xét nghiệm song song trong một môi trường CI và muốn cung cấp cho mỗi bộ kiểm tra của mình cơ sở dữ liệu với dữ liệu được tải sẵn để chạy. Là lựa chọn duy nhất của tôi để không sử dụng hình ảnh postgres tiêu chuẩn? – R0MANARMY
Vâng, các lựa chọn là như nhau. Trong trường hợp này, tôi có thể tạo ra hình ảnh của riêng bạn bằng cách sửa đổi Dockerfile cho hình ảnh Postgres chính thức. –