ทำไมนักเทียบท่าเครื่องจึงล้างข้อมูลเมื่อรีสตาร์ท?


9

ฉันใช้ Docker Toolbox บน OSX

ฉันได้สร้างภาชนะปริมาณข้อมูลสำหรับการจัดเก็บข้อมูลแบบถาวร: https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container

ฉันตรวจสอบว่าข้อมูลนี้ถูกเก็บไว้อย่างแน่นอนใน boot2docker VM (สร้างโดยเครื่องเชื่อมต่อ) และไม่ได้อยู่บนภาชนะเพื่อที่จะยังคงอยู่ อย่างไรก็ตาม "การรีสตาร์ทเครื่องนักเทียบท่า" จะล้างข้อมูลที่กำหนดเองนี้ออกไปใน vm

ฉันไม่พบเอกสารเกี่ยวกับสิ่งที่เกิดขึ้น ฉันพบหนึ่งโพสต์ในฟอรั่มที่กล่าวถึงว่าข้อมูลใน / var / lib / docker จะถูกเก็บรักษาไว้ แต่ฉันไม่พบเอกสารที่เป็นทางการใด ๆ ที่ระบุว่าและดูเหมือนแปลกเมื่อพิจารณาจากคู่มือการจัดเก็บแบบถาวรด้านบนไม่ใช้เส้นทางนี้ ข้อมูลของคุณจะถูกลบ

นี่เป็นสิ่งที่คาดหวังหรือไม่หากมีเอกสารอย่างเป็นทางการใด ๆ บนเส้นทางที่ถูกต้องในการจัดเก็บข้อมูลถาวร


แก้ไข: การเพิ่มตัวอย่างของ senario ที่ล้มเหลว

$ docker-machine ssh alt
docker@alt:~$ docker run -v /data:/var/lib/mysql --name mydata busybox sh -c "echo 'hello' > /var/lib/mysql/hello"
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
hello
docker@alt:~$ exit
$ docker-machine restart alt
Starting VM...
$ docker-machine ssh alt
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
cat: can't open '/var/lib/mysql/hello': No such file or directory

คำตอบ:


8

สิ่งนี้ควรใช้งานได้ดี:

$ docker-machine ssh default
docker@default:~$ docker run -v /data --name mydata busybox true
docker@default:~$ docker run --volumes-from mydata busybox sh -c "echo hello >/data/hello"
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello
docker@default:~$ exit
$ docker-machine restart default
Starting VM...
$ docker-machine ssh default
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello

คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับขั้นตอนต่าง ๆ ในการทำให้เกิดปัญหาของคุณอีกครั้งได้หรือไม่?

boot2docker มีระบบไฟล์แบบอ่านอย่างเดียว (จะได้รับการเช็ดเมื่อรีบูต) โดยมีข้อยกเว้น:

  1. ภาชนะบรรจุและข้อมูล (ปริมาณ) - นี่คือสิ่งที่คุณอ่าน /var/lib/docker
  2. ภาพนักเทียบท่า
  3. การกำหนดค่าตัวเชื่อมต่อ (เช่น/var/lib/boot2docker/profileตำแหน่งที่ daemon สามารถปรับแต่งได้)

สวัสดีฉันเพิ่งแนะนำการแก้ไขคำตอบของคุณ คุณหมายถึงการระบุอิมเมจ busybox ในคำสั่งรันครั้งที่ 3 และ 4 หรือไม่? โดยไม่ทำเช่นนั้นนักเทียบท่าพยายามดาวน์โหลดภาพที่เรียกว่า "sh" และ "cat" ซึ่งฉันสงสัยว่าไม่ใช่สิ่งที่คุณตั้งใจไว้ ฉันจะเพิ่มตัวอย่างที่ล้มเหลวด้านบน
เจอร์รี่

ขอขอบคุณสำหรับความช่วยเหลือของคุณ. ทั้งคุณและ @ mc0e ช่วยด้วยสิ่งนี้ดังนั้นฉันจึงมอบติ๊กให้คุณและให้รางวัลแก่เขา (รวมทั้ง +1 สำหรับทั้งคู่) ฉันหวังว่าคุณจะพิจารณางานนี้
เจอร์รี่

1
อ่าใช่พิมพ์ผิด ขอโทษที่พิมพ์ผิด
nathanleclaire

ไม่จำเป็นต้องขอโทษ ฉันแค่ตรวจสอบสองครั้งเพื่อให้แน่ใจว่าฉันไม่ได้เข้าใจผิด ขอบคุณสำหรับความช่วยเหลือของคุณด้วยสิ่งนี้
เจอร์รี่

6

ฉันไม่ได้ใช้ boot2docker แต่ถ้า / data ถูกลบเมื่อรีบูตนั่นคือที่เก็บไดรฟ์ข้อมูลของคุณ ( docker run -v /data:/var/lib/mysql) ดังนั้นมันจะหายไป

สิ่งที่คุณกำลังทำคือการรวมรูปแบบที่แตกต่างกันสองแบบเพื่อจัดการปริมาณการคงอยู่ เพื่อให้ได้รับการติดตา, ตู้คอนเทนเนอร์สามารถติดไดรฟ์จากสถานที่ที่ระบุในระบบโฮสต์ (ซึ่งสันนิษฐานว่าเป็นถาวร) --volumes-fromหรือพวกเขาสามารถเชื่อมโยงกับที่เก็บข้อมูลและการติดตั้งที่มี ดูเหมือนว่าวิธีการโฮสต์ระบบไฟล์ไม่เหมาะสำหรับ boot2docker และคุณควรใช้รูปแบบปริมาณข้อมูล (เท่านั้น)

สันนิษฐานว่าคุณควรจะสร้างที่เก็บข้อมูลของคุณด้วยมากกว่า-v /var/lib/mysql-v /data:/var/lib/mysql


การสร้างโวลุ่มโดยใช้แฟล็ก -v และจากนั้นใช้โวลุ่มจากคอนเทนเนอร์นั้นในคอนเทนเนอร์อื่นที่ใช้ --volumes-from เป็นสิ่งที่เอกสารแสดง: docs.docker.com/userguide/dockervolumes/ … ฉันคาดหวังว่าหาก -v / location รู้ว่าควรสัมพันธ์กับ / var / lib / docker / volume แล้วเพิ่มโคลอนไม่ควรเปลี่ยน อย่างน้อยที่สุดมันก็ไม่ได้ใช้งานง่าย -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql นอกจากนี้ดูเหมือนว่าเอกสาร mysql- docker
เจอร์รี่

ขอขอบคุณสำหรับความช่วยเหลือของคุณ. ทั้งคุณและ @nathanleclaire ช่วยด้วยอันนี้ดังนั้นฉันจึงมอบรางวัลให้คุณ (เพราะมันคุ้มค่ากว่า) และฉันมอบติ๊กให้ nathanleclaire (รวมทั้ง +1 สำหรับทั้งคู่) ฉันหวังว่าคุณจะคิดว่ามันยุติธรรม
เจอร์รี่

@Gerry แนะนำให้สร้างวอลลุ่มแล้วจึงใช้คำสั่ง --volumes-from การติดตั้งข้อมูลชั่วคราว / ข้อมูลบนภาชนะของคุณไม่ใช่
mc0e

ใช่ปัญหาคือฉันไม่ทราบว่า / ข้อมูลชั่วคราวจนกว่าฉันจะรีสตาร์ท
เจอร์รี่

0

โปรดทราบว่าฉันใช้นักเทียบท่าสำหรับ mac เบต้าซึ่งใช้ xhyve vm

เนื้อหาของ / var / lib / boot2docker จะยังคงอยู่ระหว่างการรีสตาร์ทเครื่อง ดังนั้นหากคุณต้องการให้ไฟล์บางไฟล์พร้อมใช้งานบน vm ของคุณให้วางไว้ในไดเรกทอรีนี้

หากคุณต้องการให้เข้าถึงได้ในตำแหน่งอื่นสำหรับการเรียกใช้คอนเทนเนอร์นักเทียบท่าคุณสามารถเพิ่มสิ่งต่อไปนี้ใน / var / lib / boot2docker / profile:

mkdir -p /desired/path
ln -s /var/lib/boot2docker/your.file /desire/path/your.file

หากคุณต้องการเพิ่มการกำหนดค่าอื่น ๆ ไปยังไฟล์ระบบที่จะคงอยู่ระหว่างการรีสตาร์ท vm เช่นค่าพิเศษในไฟล์โฮสต์ของคุณคุณสามารถเพิ่มคำสั่งเช่นหนึ่งด้านล่างเพื่อ / var / lib / boot2docker / profile:

echo '127.0.0.1 your.domain.com' >> /etc/hosts

หวังว่ามันจะช่วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.