คำถามเดิม: วิธีใช้คำสั่ง VOLUME ใน Dockerfile
คำถามที่เกิดขึ้นจริงที่ฉันต้องการที่จะแก้ปัญหาคือ - วิธีการติดตั้งไดรฟ์เป็นเจ้าภาพในภาชนะนักเทียบท่าใน Dockerfile ในระหว่างการสร้างคือการมีความสามารถในช่วงdocker run -v /export:/export
docker build
เหตุผลที่อยู่เบื้องหลังสำหรับฉันคือเมื่อสร้างสิ่งต่าง ๆ ใน Docker ฉันไม่ต้องการให้apt-get install
แคช( ) เหล่านั้นล็อกใน docker เดียว แต่เพื่อแบ่งปัน / นำกลับมาใช้ใหม่ นั่นเป็นเหตุผลหลักที่ฉันถามคำถามนี้
ปรับปรุงล่าสุด:
ก่อนที่นักเทียบท่า v18.09 คำตอบที่ถูกต้องควรเป็นคำตอบที่ขึ้นต้นด้วย:
มีวิธีการเมานต์โวลุ่มในระหว่างบิลด์ แต่ไม่เกี่ยวข้องกับ Dockerfiles
อย่างไรก็ตามนั่นเป็นคำตอบที่ได้รับการจัดการและสนับสนุนที่ไม่ดี เมื่อฉันติดตั้งนักเทียบท่าฉันมีฉันบังเอิญสะดุดกับบทความต่อไปนี้:
เชื่อมต่อบริการ apt-cacher-ng
https://docs.docker.com/engine/examples/apt-cacher-ng/
นั่นเป็นวิธีแก้ปัญหาของนักเทียบท่าสำหรับคำถามนี้ไม่ใช่โดยตรง แต่โดยอ้อม มันเป็นวิธีที่นักเทียบท่าดั้งเดิมแนะนำให้เราทำ และฉันก็ยอมรับว่ามันดีกว่าที่ฉันพยายามถามที่นี่
อีกวิธีหนึ่งคือคำตอบที่ยอมรับใหม่เช่น Buildkit ใน v18.09
เลือกสิ่งที่เหมาะกับคุณ
เป็น:มีวิธีแก้ปัญหา - rocker ซึ่งไม่ได้มาจาก Docker แต่ตอนนี้ rocker นั้นถูกยกเลิกฉันกลับคำตอบกลับเป็น"ไม่สามารถทำได้"อีกครั้ง
การอัปเดตเก่า:ดังนั้นคำตอบคือ "ไม่สามารถทำได้" ฉันจะยอมรับว่ามันเป็นคำตอบที่ผมรู้ว่าปัญหาได้รับการกล่าวถึงอย่างกว้างขวางในhttps://github.com/docker/docker/issues/3156 ฉันสามารถเข้าใจได้ว่าการพกพาเป็นปัญหาที่สำคัญยิ่งสำหรับนักพัฒนานักเทียบท่า แต่ในฐานะผู้ใช้นักเทียบท่าฉันต้องบอกว่าฉันผิดหวังมากเกี่ยวกับคุณสมบัติที่ขาดหายไปนี้ ให้ฉันปิดการโต้แย้งของฉันด้วยคำพูดจากการสนทนาดังกล่าว: " ฉันต้องการใช้ Gentoo เป็นภาพฐาน แต่ไม่ต้องการให้> 1GB ของข้อมูลต้นไม้พอร์เทจอยู่ในเลเยอร์ใด ๆ เมื่อภาพถูกสร้างขึ้นคุณ อาจมีภาชนะบรรจุขนาดกะทัดรัดที่ดีถ้ามันไม่ได้สำหรับต้นไม้ขนาดใหญ่ที่ต้องปรากฏในภาพในระหว่างการติดตั้ง"ใช่ฉันสามารถใช้ wget หรือ curl เพื่อดาวน์โหลดสิ่งที่ฉันต้องการได้ แต่ความจริงที่ว่าตอนนี้การพิจารณาเรื่องความสะดวกในการพกพาทำให้ฉันต้องดาวน์โหลด> 1GB ของโครงสร้างต้นไม้ในแต่ละครั้งที่สร้างภาพฐาน Gentoo นั้นไม่มีประสิทธิภาพหรือเป็นมิตรต่อผู้ใช้ ยิ่งกว่านั้นพื้นที่เก็บข้อมูลของแพคเกจจะอยู่ภายใต้ / usr / portage เสมอดังนั้นแบบพกพาภายใต้ Gentoo อีกครั้งฉันเคารพการตัดสินใจ แต่โปรดอนุญาตให้ฉันแสดงความผิดหวังของฉันเช่นกันในเวลาเฉลี่ยขอบคุณ
คำถามเดิมในรายละเอียด:
จาก
แชร์ไดเรกทอรีผ่านไดรฟ์ข้อมูล
http://docker.readthedocs.org/en/v0.7.3/use/working_with_volumes/
มันบอกว่าฟีเจอร์ดาต้าวอลุ่ม "มีให้บริการตั้งแต่ Docker Remote API รุ่น 1" นักเทียบท่าของฉันเป็นรุ่น 1.2.0 แต่ฉันพบตัวอย่างที่ระบุในบทความด้านบนไม่ทำงาน:
# BUILD-USING: docker build -t data .
# RUN-USING: docker run -name DATA data
FROM busybox
VOLUME ["/var/volume1", "/var/volume2"]
CMD ["/usr/bin/true"]
อะไรคือวิธีที่เหมาะสมใน Dockerfile เพื่อเมานท์วอลลุ่มที่เมาท์โฮสต์ลงในคอนเทนเนอร์ docker ผ่านคำสั่ง VOLUME
$ apt-cache policy lxc-docker
lxc-docker:
Installed: 1.2.0
Candidate: 1.2.0
Version table:
*** 1.2.0 0
500 https://get.docker.io/ubuntu/ docker/main amd64 Packages
100 /var/lib/dpkg/status
$ cat Dockerfile
FROM debian:sid
VOLUME ["/export"]
RUN ls -l /export
CMD ls -l /export
$ docker build -t data .
Sending build context to Docker daemon 2.56 kB
Sending build context to Docker daemon
Step 0 : FROM debian:sid
---> 77e97a48ce6a
Step 1 : VOLUME ["/export"]
---> Using cache
---> 59b69b65a074
Step 2 : RUN ls -l /export
---> Running in df43c78d74be
total 0
---> 9d29a6eb263f
Removing intermediate container df43c78d74be
Step 3 : CMD ls -l /export
---> Running in 8e4916d3e390
---> d6e7e1c52551
Removing intermediate container 8e4916d3e390
Successfully built d6e7e1c52551
$ docker run data
total 0
$ ls -l /export | wc
20 162 1131
$ docker -v
Docker version 1.2.0, build fa7b24f
VOLUME ~/host_dir ~/container_dir
แน่นอนมีการอภิปรายอย่างกว้างขวางว่ามันไม่ควรได้รับอนุญาตให้เชื่อมโยงไดเรกทอรีโฮสต์และไดเรกทอรีภาชนะในระหว่างการสร้างคือสิ่งที่ต้องการ การอภิปรายค่อนข้างกว้างขวางหากมีวิธีสั้น ๆ ในการสรุปเหตุผลคืออะไร