2014-12-09 17 views
12

Tôi đã tạo ứng dụng đường ray trong môi trường trình docker và nó liên kết đến một thể hiện postgres. Tôi đã chỉnh sửa vùng chứa postgres để thêm dữ liệu ban đầu (bằng cách chạy rake db: thiết lập từ ứng dụng đường ray). Bây giờ tôi cam kết cơ sở dữ liệu postgres, nhưng nó dường như không nhớ dữ liệu của tôi khi tôi tạo một container mới (của hình ảnh postgres cam kết).kho lưu trữ docker với dữ liệu ban đầu không được duy trì trên cam kết

Không thể lưu dữ liệu trong cam kết và sau đó sử dụng lại dữ liệu sau đó?

tôi đã sử dụng postgres ảnh: https://registry.hub.docker.com/_/postgres/

Trả lời

13

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.

+0

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

+0

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. –

1

Không thể lưu dữ liệu trong khi cam kết vì dữ liệu nằm trên giá treo cụ thể cho vùng chứa đó và sẽ bị xóa khi bạn chạy docker rm <container ID> nhưng bạn có thể sử dụng khối lượng dữ liệu để chia sẻ và sử dụng lại dữ liệu giữa vùng chứa và thay đổi được thực hiện trực tiếp trên ổ đĩa.

Bạn có thể sử dụng docker run -v /host/path:/Container/path để gắn ổ đĩa vào vùng chứa mới.

Vui lòng tham khảo: https://docs.docker.com/userguide/dockervolumes/

+0

Âm lượng không bị xóa khi bạn chạy 'docker rm '. Bạn phải chỉ rõ tùy chọn '-v', nghĩa là' docker rm -v '. –

3

Tạo một Dockerfile mới và thay đổi PGDATA:

FROM postgres:9.2.10 

RUN mkdir -p /var/lib/postgresql-static/data 
ENV PGDATA /var/lib/postgresql-static/data 
Các vấn đề liên quan