UPDATE 2016/03/02 : ณ หาง 1.9.0, หางได้ชื่อไดรฟ์ซึ่งแทนที่ข้อมูลเท่านั้นภาชนะบรรจุ คำตอบด้านล่างรวมถึงโพสต์บล็อกที่เชื่อมโยงของฉันยังคงมีคุณค่าในแง่ของวิธีคิดเกี่ยวกับข้อมูลภายในตัวเชื่อมต่อแต่พิจารณาใช้โวลุ่มที่มีชื่อเพื่อใช้รูปแบบที่อธิบายด้านล่างมากกว่าที่เก็บข้อมูล
ผมเชื่อว่าวิธีที่เป็นที่ยอมรับในการแก้ปัญหานี้โดยใช้ข้อมูลเพียงภาชนะบรรจุ ด้วยวิธีนี้การเข้าถึงข้อมูลปริมาณทั้งหมดผ่านคอนเทนเนอร์ที่ใช้-volumes-from
data container ดังนั้นโฮสต์ uid / gid จึงไม่สำคัญ
ตัวอย่างเช่นกรณีการใช้งานหนึ่งกรณีที่ให้ไว้ในเอกสารกำลังสำรองปริมาณข้อมูล เมื่อต้องการทำเช่นนี้คอนเทนเนอร์อื่นถูกใช้เพื่อทำการสำรองข้อมูลผ่านtar
และมันก็ใช้-volumes-from
ในการเมานต์โวลุ่ม ดังนั้นฉันคิดว่าจุดสำคัญในการ grok คือ: แทนที่จะคิดเกี่ยวกับวิธีการเข้าถึงข้อมูลในโฮสต์ที่มีสิทธิ์ที่เหมาะสมคิดเกี่ยวกับวิธีการทำสิ่งที่คุณต้องการ - สำรองข้อมูลการเรียกดูและอื่น ๆ - ผ่านภาชนะอื่น . คอนเทนเนอร์เองจำเป็นต้องใช้ uid / gids ที่สอดคล้องกัน แต่ไม่จำเป็นต้องแมปกับสิ่งใดบนโฮสต์จึงยังคงพกพาได้
นี่เป็นสิ่งที่ค่อนข้างใหม่สำหรับฉันเช่นกัน แต่หากคุณมีกรณีการใช้งานเฉพาะโปรดแสดงความคิดเห็นและฉันจะพยายามขยายคำตอบ
ปรับปรุง : สำหรับกรณีการใช้งานที่กำหนดในความคิดเห็นที่คุณอาจมีภาพที่some/graphite
จะเรียกใช้กราไฟท์และภาพsome/graphitedata
เป็นที่เก็บข้อมูล ดังนั้นการเพิกเฉยพอร์ตและDockerfile
รูปภาพsome/graphitedata
นั้นจึงเป็นสิ่งที่ต้องการ:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
RUN mkdir -p /data/graphite \
&& chown -R graphite:graphite /data/graphite
VOLUME /data/graphite
USER graphite
CMD ["echo", "Data container for graphite"]
สร้างและสร้างที่เก็บข้อมูล:
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
some/graphite
Dockerfile นอกจากนี้ยังควรได้รับเดียวกัน UID gids / จึงอาจมีลักษณะบางอย่างเช่นนี้
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
# ... graphite installation ...
VOLUME /data/graphite
USER graphite
CMD ["/bin/graphite"]
และมันจะถูกเรียกใช้ดังนี้:
docker run --volumes-from=graphitedata some/graphite
ตกลงตอนนี้ที่ให้เราบรรจุกราไฟท์และภาชนะข้อมูลอย่างเดียวที่เกี่ยวข้องกับผู้ใช้ที่ถูกต้อง / กลุ่ม (หมายเหตุคุณสามารถใช้some/graphite
ภาชนะสำหรับเก็บข้อมูลอีกครั้งเช่นกันแทนที่เอาชนะรายการ / cmd เมื่อใช้มัน แต่มีพวกเขาเป็น ภาพแยกต่างหาก IMO ชัดเจนขึ้น)
ตอนนี้สมมติว่าคุณต้องการแก้ไขบางสิ่งในโฟลเดอร์ข้อมูล ดังนั้นแทนที่จะผูกติดตั้งไดรฟ์ข้อมูลกับโฮสต์และแก้ไขที่นั่นสร้างคอนเทนเนอร์ใหม่เพื่อทำงานนั้น some/graphitetools
ช่วยให้เรียกว่า ให้สร้างผู้ใช้ / กลุ่มที่เหมาะสมเช่นเดียวกับsome/graphite
รูปภาพ
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
VOLUME /data/graphite
USER graphite
CMD ["/bin/bash"]
คุณสามารถสร้าง DRY นี้โดยการสืบทอดจากsome/graphite
หรือsome/graphitedata
ใน Dockerfile หรือแทนที่จะสร้างภาพใหม่เพียงแค่ใช้หนึ่งในสิ่งที่มีอยู่เดิม (แทนที่จุดเข้า / cmd ตามความจำเป็น)
ตอนนี้คุณเพียงแค่เรียกใช้:
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
vi /data/graphite/whatever.txt
แล้วก็ มันทำงานได้อย่างสมบูรณ์เพราะภาชนะทั้งหมดมีผู้ใช้กราไฟท์เดียวกันกับ uid / gid ที่ตรงกัน
เนื่องจากคุณไม่เคยเมานต์/data/graphite
จากโฮสต์คุณไม่สนใจวิธีที่โฮสต์ uid / gid แม็พกับ uid / gid ที่กำหนดภายในgraphite
และgraphitetools
คอนเทนเนอร์ ขณะนี้คอนเทนเนอร์เหล่านั้นสามารถปรับใช้กับโฮสต์ใดก็ได้และจะยังคงทำงานได้อย่างสมบูรณ์
สิ่งที่เป็นระเบียบเกี่ยวกับเรื่องนี้คือgraphitetools
อาจมียูทิลิตี้และสคริปต์ที่มีประโยชน์ทุกประเภทซึ่งตอนนี้คุณสามารถปรับใช้แบบพกพาได้
ปรับปรุง 2 : หลังจากเขียนคำตอบนี้ฉันตัดสินใจที่จะเขียนโพสต์บล็อกที่สมบูรณ์มากขึ้นเกี่ยวกับวิธีการนี้ ฉันหวังว่ามันจะช่วย
อัปเดต 3 : ฉันแก้ไขคำตอบนี้และเพิ่มรายละเอียดเฉพาะเพิ่มเติม ก่อนหน้านี้มีข้อสันนิษฐานที่ไม่ถูกต้องบางประการเกี่ยวกับความเป็นเจ้าของและ perms - โดยทั่วไปความเป็นเจ้าของจะถูกกำหนดในเวลาที่สร้างโวลุ่มเช่นในที่เก็บข้อมูลเพราะนั่นคือเมื่อสร้างโวลุ่ม ดูบล็อกนี้ นี่ไม่ใช่ข้อกำหนด - คุณสามารถใช้ data container เป็น "reference / handle" และตั้งค่าความเป็นเจ้าของ / perms ใน container อื่นผ่าน chownes ใน entrypoint ซึ่งลงท้ายด้วย gosu เพื่อรันคำสั่งเป็นผู้ใช้ที่ถูกต้อง หากใครสนใจวิธีนี้โปรดแสดงความคิดเห็นและฉันสามารถให้ลิงก์ไปยังตัวอย่างโดยใช้วิธีนี้