เรามีการปรับใช้ Docker Swarm ที่ทำงานบนสองโหนด (node1 และ node2) สำหรับแอปพลิเคชันทางธุรกิจของเรา

แอปพลิเคชันต้องการไดรฟ์ข้อมูลเพื่อเก็บข้อมูลถาวร เนื่องจากไม่ชัดเจนว่าคอนเทนเนอร์ถูกปรับใช้ที่ใด (โหนด 1 หรือโหนด2) และอาจมีคอนเทนเนอร์สองแห่งของแอปพลิเคชันของเราที่ควรทำงานบนทั้งสองโหนด เราจึงต้องการโซลูชันเพื่อจัดเตรียมไดรฟ์ข้อมูลที่ใช้ร่วมกันสำหรับโหนดทั้งหมด

สำหรับการแชร์วอลุ่ม เราตั้งค่าเซิร์ฟเวอร์ NFS บนโหนดที่สามด้วยไฟล์ /etc/exports ต่อไปนี้:

/srv          *(rw,sync,anonuid=1000,anongid=1000,all_squash,subtree_check,crossmnt,fsid=root)

(ฉันใช้ anannuid/gid เพื่อตั้งค่าอย่างชัดเจนสำหรับแต่ละไฟล์ในการส่งออกข้อมูลผู้ใช้สำหรับผู้ใช้ที่รู้จักในระบบ node3 all_squash ใช้เพื่อให้แน่ใจว่าสิทธิ์ไฟล์ทั้งหมดจากผู้ใช้ที่เข้าถึงทั้งหมดถูกเขียนใหม่ให้กับผู้ใช้ในเครื่องนี้)

ใน docker-compose.yml เราใช้การตั้งค่าต่อไปนี้เพื่อรวมโวลุ่ม:

volumes:
  nfs-data:
    driver: local
    driver_opts:
      type: nfs
      o: nfsvers=4,addr=node3.example.com,rw,nolock,soft

ขณะนี้เราพบปัญหาที่คอนเทนเนอร์ไม่ต้องการเริ่มทำงาน ข้อความแสดงข้อผิดพลาดคือ:

failed to copy file info for /var/lib/docker/volumes/MY_CONTAINER_nfs-data/_data: failed to chown /var/lib/docker/volumes/MY_CONTAINER_nfs-data/_data: lchown /var/lib/docker/volumes/MY_CONTAINER_nfs-data/_data: operation not permitted

หลังจากสำรวจไปรอบๆ ฉันพบว่าปัญหาอยู่ที่โฟลเดอร์ว่างเริ่มต้นในไดเร็กทอรี NFS ที่ส่งออกบนเซิร์ฟเวอร์ node3 ทันทีที่ฉันใส่ไฟล์เปล่า การเริ่มต้นคอนเทนเนอร์ใน node1 และ node2 ก็ทำงานได้ดีโดยสิ้นเชิง

ไม่มีใครมีคำอธิบายสำหรับสิ่งนั้นหรือไม่?

answer

เมื่อไดรฟ์ข้อมูลที่มีชื่อเริ่มต้นจากสถานะว่าง/ใหม่ นักเทียบท่าจะคัดลอกเนื้อหาของไดเร็กทอรีรูปภาพไปยังไดรฟ์ข้อมูลที่มีชื่อ มีหลายตัวเลือกในการจัดการกับสิ่งนี้:

  1. เริ่มต้นโวลุ่มที่ตั้งชื่อด้วยเนื้อหาก่อนที่คอนเทนเนอร์จะเริ่มต้น ดังที่คุณเห็นแล้ว การดำเนินการนี้จะปิดใช้งานขั้นตอนการเริ่มต้นโวลุ่ม
  2. อัปเดตรูปภาพให้มี uid/gid ที่ต้องการในไดเร็กทอรีและมีไฟล์ที่มีนามสกุลRUN chown -R 1000:1000 /path. สิ่งนี้ควรป้องกันปัญหา แต่คุณจะต้องการทดสอบเพื่อให้แน่ใจว่ายังไม่มีคำสั่งที่พยายามเรียกใช้จากนักเทียบท่า ทั้งนี้ขึ้นอยู่กับวิธีการเริ่มต้นไฟล์เหล่านี้
  3. ปิดใช้งานสควอชบน NFS เป็นสาเหตุทั่วไปของปัญหากับไดรฟ์ข้อมูลนักเทียบท่า และฉันไม่แน่ใจว่าคุณจะได้รับประโยชน์ด้านความปลอดภัยอะไรบ้าง หากคุณต้องการหลีกเลี่ยงรูทจริงๆ คุณสามารถลองกำหนดค่านักเทียบท่าด้วยเนมสเปซผู้ใช้ แต่สิ่งนี้จะทำลายวอลลุมของโฮสต์ที่คุณถือว่า uid ตรงกัน ดังนั้นโปรดเตรียมพร้อมสำหรับความพยายาม
  4. ปิดใช้งานการเริ่มต้นโวลุ่ม ด้วยข้อกำหนดการเขียนปัจจุบัน จะมีตัวเลือก "nocopy" ที่คุณสามารถเพิ่มลงในข้อกำหนดปริมาณบริการของคุณได้โดยใช้ไวยากรณ์แบบยาว สิ่งนี้ทำได้บนบริการที่มีการใช้โวลุ่ม ไม่ใช่ที่ระดับบนสุดที่มีการกำหนดโวลุ่ม

ตัวอย่างจากเอกสารประกอบของนักเทียบท่าในตัวเลือก "nocopy" ดูเหมือนว่า:

version: "3.8"
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true

volumes:
  mydata: