Yêu cầu thg 8 27, 2017 5:19 SA 825 0 1
  • 825 0 1
0

Vấn đề đồng bộ thư mục giữa container và máy host

Chia sẻ
  • 825 0 1

Hiện tại mình đang sử dụng docker compose để deploy rails app. các container đang dùng là rails app(sử dụng unicorn), nginx. mình muốn giữ lại các thư mục public, log trong container nên mình đã share 2 thư mục vs máy chủ host. Khi deploy lần đầu tiên, mình thử vào trong container và check nội dung của thư mục trên nhưng nội dung đã bị xoá hết. Vậy có cách nào để đồng bộ thư mục của container và host k?( nếu host k có sẽ copy từ container ra) Thêm nữa là trc khi deploy thì mình đã chạy precomplie dưới local rồi mới thực hiện tạo image. docker-compose.yml app: volumes: -“/tmp/:/app/public” - “/tmp/:/app/log”

1 CÂU TRẢ LỜI


Đã trả lời thg 8 28, 2017 1:16 SA
Đã được chấp nhận
+3

Theo mình hiểu thì bạn đang gặp vấn đề về việc bạn đã có sẵn một Docker Image với thư mục /app/public/app/log có nội dung ở trong đó. Và khi chạy Docker Compose thì bạn mount thư mục ở máy host vào, và 2 thư mục /app/public, /app/log bị mất dữ liệu?

Nếu đúng là như thế thì mình xin giải thích như sau:

  • Docker sẽ tạo ra volume và tiến hành mount volume đó vào thư mục bạn đã chỉ định trong container. Như vậy dữ liệu cũ trong container sẽ bị mask bởi dữ liệu ở máy host (chứ không phải bị ghi đè, bạn vào trong container, gõ df -hthì sẽ thấy thư mục đang được mount, và nếu unmout thư mục (để dùng được lệnh umount trong container, bạn cần chạy container với tham số --privileged) bạn sẽ thấy lại được dữ liệu cũ trong đó). Thế nên việc không thể access dữ liệu cũ vốn có ở trong container là không thể.
  • Chính vì những lý do trên, những folder trong container mà bạn cần mount thư mục ở máy host vào thì bạn không nên để gì trong đó, chúng chỉ nên là những folder trống (hoặc không tồn tại 😄). Nếu bạn muốn copy nội dung bên trong container ra ngoài trước khi volume được mount thì có lẽ phải tự thực hiện gõ lệnh manual để dựng container lên rồi copy thôi 😕

Một chút lưu ý nhỏ. 😃 Với nội dung docker-compose.yml như thế này

volumes:
  - "/tmp/:/app/public"
  - "/tmp/:/app/log"

thì cùng thư mục /tmp sẽ được mount vào cả 2 thư mục /app/public với /app/log, hay nói cách khác, 2 thư mục /app/public/app/log sẽ có nội dung giống nhau. Bạn nên mount kiểu “/tmp/public:/app/public”“/tmp/log:/app/log” thì hơn :slight_smile:

Chia sẻ
Avatar Hoàng Phương @phuong1492
thg 8 28, 2017 2:35 SA

Cám ơn anh đã trả lời! Mỗi lần release sẽ phải dựng lại container, vậy em muốn giữ lại nội dung trong thư mục public và log của container trước và update thêm nội dung của build container lần này thì nên làm như thế nào anh?

Avatar Tran Duc Thang @thangtd90
thg 8 28, 2017 2:43 SA

@phuong1492 Mình có thắc mắc một chút là trong thư mục logpublic của bạn đang chứa dữ liệu gì vậy? Tại sao khi release lại cần thay đổi trong đó? Thay vì cứ tìm cách đi theo hướng

giữ lại nội dung trong thư mục public và log của container trước và update thêm nội dung của build container lần này

bạn thử nghĩ cách giải quyết theo hướng

những folder trong container mà bạn cần mount thư mục ở máy host vào thì bạn không nên để gì trong đó, chúng chỉ nên là những folder trống

xem sao 🤔 Những thứ thư mục trong container đã có dữ liệu thì không nên mount, đã mount thì không nên chứa dữ liệu.

Avatar Hoàng Phương @phuong1492
thg 8 28, 2017 2:59 SA
  • Trong public ngoài js và css(đc sinh tạo ra khi chạy assest precompile) thì còn có chứa các file do user upload lên, hoặc những file csv mà user export ra. Nếu không đc thì có lẽ phải lưu dữ liệu vào cloud storage nào đó anh nhỉ?
Avatar Tran Duc Thang @thangtd90
thg 8 28, 2017 3:08 SA

@phuong1492 Lưu các file mà user upload lên cloud storage cũng là một giải pháp, tuy nhiên vẫn còn những cách giải quyết khác mà :slight_smile:

Mình nghĩ các file do user upload lên sẽ được đặt vào trong một thư mục riêng đúng không bạn, chẳng hạn như public/upload, và nó sẽ tách biệt với thư mục chứa những file assets precompile (css, javascript) của bạn (giả sử như nó là public/assets) 🤔

Như vậy thì thay vì mount toàn bộ thư mục public, bạn chỉ cần mount thư mục public/upload ra ngoài là được mà, do nó là thư mục chứa file user upload, nên ban đầu nó cũng không chứa gì, và qua các bản release nó cũng sẽ không thay đổi gì đúng không bạn 😄

Avatar Hoàng Phương @phuong1492
thg 8 28, 2017 3:33 SA

vâng, em cám ơn ạ!

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí