ฉันทำข้อมูลของฉันหายเมื่อคอนเทนเนอร์ออก


394

แม้จะมีบทช่วยสอนแบบโต้ตอบของนักเทียบท่าและคำถามที่พบบ่อยฉันจะสูญเสียข้อมูลของฉันเมื่อคอนเทนเนอร์ออก

ฉันได้ติดตั้ง Docker ตามที่อธิบายไว้ที่นี่: http://docs.docker.io/en/latest/installation/ubuntulinux โดยไม่มีปัญหาใด ๆ บน Ubuntu 13.04

แต่มันจะสูญเสียข้อมูลทั้งหมดเมื่อออก

iman@test:~$ sudo docker version
Client version: 0.6.4 
Go version (client): go1.1.2 
Git commit (client): 2f74b1c 
Server version: 0.6.4 
Git commit (server): 2f74b1c 
Go version (server): go1.1.2 
Last stable version: 0.6.4 


iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:05:47 Unable to locate ping 
iman@test:~$ sudo docker run ubuntu apt-get install ping
Reading package lists... 
Building dependency tree... 
The following NEW packages will be installed: 
  iputils-ping 
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. 
Need to get 56.1 kB of archives. 
After this operation, 143 kB of additional disk space will be used. 
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB] 
debconf: delaying package configuration, since apt-utils is not installed 
Fetched 56.1 kB in 0s (195 kB/s) 
Selecting previously unselected package iputils-ping. 
(Reading database ... 7545 files and directories currently installed.) 
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ... 
Setting up iputils-ping (3:20101006-1ubuntu1) ... 
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:06:11 Unable to locate ping 
iman@test:~$ sudo docker run ubuntu touch /home/test
iman@test:~$ sudo docker run ubuntu ls /home/test
ls: cannot access /home/test: No such file or directory 

ฉันยังทดสอบด้วยเซสชันแบบโต้ตอบด้วยผลลัพธ์เดียวกัน ฉันลืมอะไรไปหรือเปล่า

แก้ไข: สำคัญสำหรับผู้ใช้ DOCKER ใหม่

ในฐานะที่เป็น @ โมฮัมเหม็-noureldin และคนอื่น ๆ กล่าวว่าในความเป็นจริงนี้อยู่ไม่ภาชนะออก ทุกครั้งที่มันเพิ่งสร้างคอนเทนเนอร์ใหม่


10
ที่ไม่สามารถเรียกว่า "การออกจากตู้คอนเทนเนอร์ " คุณเพียงแค่สร้างคอนเทนเนอร์ใหม่การใช้คำที่ออกอาจทำให้เกิดความสับสนได้มาก
Mohammed Noureldin

1
@ MohammedNoureldin คุณพูดถูกการออกไม่ถูกต้อง แต่นี่คือสิ่งที่คุณฉันและคนอื่น ๆ คิด ดังนั้นมันจึงเป็นคำที่ดีกว่าการแก้ไขของคุณทำให้คำถามเป็นคำตอบ! ผู้ค้นหาใหม่จะไม่พบที่นี่!
iman

ที่จุดเริ่มต้นของฉันกับนักเทียบท่าฉันคิดว่าจริง ๆ แล้วเนื่องจากคำถามของคุณฉันพบว่าที่อยู่นั้นไม่ถูกต้อง ชื่อใหม่ได้รับการตรวจสอบและยอมรับแล้วฉันไม่เข้าใจว่าทำไมบางคนถึงยืนยันชื่อผิดมันเป็นคำถามของคุณและการสืบทอดของคุณ
Mohammed Noureldin

3
ฉันเห็นด้วยกับ @MohammedNoureldin Dockerการรวมกันของชื่อเฉพาะตัวอย่างและการตอบรับไม่ได้ผู้อ่านความช่วยเหลือในอนาคตและโดยเฉพาะอย่างยิ่งผู้เริ่มต้นทำความเข้าใจ ฉันขอเสนอให้เก็บชื่อและคำถามเดิมไว้ตั้งแต่ผู้เริ่มต้นจะค้นหาสิ่งนี้อย่างแน่นอน แต่ทำไมคุณไม่เพิ่มสิ่งที่อธิบายความเข้าใจผิดของคุณในเวลาที่คุณเขียนโพสต์ มันจะช่วยทำให้สิ่งต่าง ๆ ชัดเจน นี่คือวัฒนธรรมของเราที่นี่ที่ SO ... ใช่ไหม :-)
tgogos

2
ฉันมีปัญหานี้ ... ทุกครั้งที่คุณออกจาก U คุณต้องเริ่มต้นคอนเทนเนอร์ของคุณไม่ได้รัน ... เรียกใช้อิมเมจ agane สร้างคอนเทนเนอร์ใหม่ซึ่งจะช่วยให้นักเริ่มต้น <container id> นักเทียบท่าแนบ <container id>
fatemeh

คำตอบ:


399

คุณจำเป็นต้องกระทำการเปลี่ยนแปลงที่คุณทำกับภาชนะบรรจุและเรียกใช้ ลองสิ่งนี้:

sudo docker pull ubuntu

sudo docker run ubuntu apt-get install -y ping

จากนั้นรับ ID คอนเทนเนอร์โดยใช้คำสั่งนี้:

sudo docker ps -l

กระทำการเปลี่ยนแปลงคอนเทนเนอร์:

sudo docker commit <container_id> iman/ping 

จากนั้นเรียกใช้คอนเทนเนอร์:

sudo docker run iman/ping ping www.google.com

สิ่งนี้น่าจะใช้ได้


9
ดังนั้นฉันควรใช้การส่งมอบหลังจากดำเนินการแต่ละครั้งเพื่อเก็บรักษาข้อมูล
iman

5
Commit ควรใช้เฉพาะเมื่อคุณทำการเปลี่ยนแปลงในคอนเทนเนอร์ (เช่นการติดตั้งเครื่องมือหรือข้อมูลใหม่) เพื่อให้การเปลี่ยนแปลงเหล่านั้นได้รับการบันทึกและครั้งต่อไปเมื่อคุณเรียกใช้คอนเทนเนอร์ใหม่จากรูปภาพนั้นจะเริ่มจากจุดที่บันทึกล่าสุดหรือ กระทำการเก็บรักษาข้อมูลของคุณ
Unferth

7
@ ไม่ต้องทำอะไรถ้าฉันต้องการยืนยันการเปลี่ยนแปลง <none>จนถึงขณะนี้ก็สร้างภาพมากขึ้นด้วย ฉันจะเพิ่มความมุ่งมั่นต่อท้ายภาพที่มีอยู่ได้อย่างไร
Marconi

62
การเปลี่ยนแปลงที่กระทำที่เพิ่มขึ้นไม่ใช่ "ทางนักเทียบท่า" ใช้ DOCKERFILE
user2105103

23
คุณจะผูกมัดจากภายในภาชนะบรรจุอย่างไร? พิจารณาสถานการณ์ต่อไปนี้: 1) ฉันกำลังเรียกใช้คอนเทนเนอร์เช่นนี้: นักเทียบท่าวิ่ง -i -t myimage / bin / bash 2) ฉันทำการเปลี่ยนแปลงบางอย่าง 3) ฉันไม่สามารถกระทำจากภายในคอนเทนเนอร์ดังนั้นเมื่อฉันออกจากภาชนะฉัน จะหลวมข้อมูลทั้งหมดของฉันโดยไม่ต้องมีโอกาสที่จะยอมรับการเปลี่ยนแปลงก่อนหน้าของฉัน
qgicup

374

เมื่อคุณใช้docker runเพื่อเริ่มต้นคอนเทนเนอร์มันจะสร้างคอนเทนเนอร์ใหม่ตามรูปภาพที่คุณระบุ

นอกเหนือจากคำตอบที่เป็นประโยชน์อื่น ๆ ที่นี่โปรดทราบว่าคุณสามารถรีสตาร์ทคอนเทนเนอร์ที่มีอยู่หลังจากออกแล้วและการเปลี่ยนแปลงของคุณยังคงอยู่ที่นั่น

docker start f357e2faab77 # restart it in the background
docker attach f357e2faab77 # reattach the terminal & stdin

88
docker psแสดงให้คุณเห็นเท่านั้นเรียกใช้คอนเทนเนอร์นักเทียบท่า docker ps -aแสดงให้คุณเห็นถึงสิ่งที่ออก - และคุณสามารถวิ่งต่อไปได้ การมอบอำนาจจำเป็นเฉพาะหลังจากการเรียกใช้แต่ละครั้งหากคุณต้องการสร้างสแน็ปช็อตที่นั่นสำหรับการใช้งานในอนาคตมิฉะนั้นตัวคอนเทนเนอร์จะติดอยู่รอบ ๆ เพื่อให้คุณใช้ต่อไป
user1278519

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

2
@Jas ถ้าคุณติดกับภาชนะเดียวกันและไม่สร้างใหม่ไม่มีปัญหา ทุกวันนี้นักเทียบท่ามีนโยบายการรีสตาร์ทดังนั้นคุณสามารถกำหนดให้รีสตาร์ทคอนเทนเนอร์เดียวกันเมื่อรีบูตเครื่อง ฉันขอแนะนำให้คุณใส่เจนกินส์ของคุณไว้ในวอลลุ่มเพื่อให้สามารถเข้าถึงได้จากภายนอก (สำรองข้อมูล ฯลฯ )
ZeissS

7
นี่คือวิธีที่มีประโยชน์ในการคัดลอกไฟล์ออกจากภาชนะเมื่อคุณออกจาก:docker cp $(docker ps -alq):/path/to/file .
จอช Habdas

3
คุณสามารถเริ่มและแนบคอนเทนเนอร์ด้วยชื่อของมัน (เช่น docker run -it --name my_debian debianและหลังdocker start my_debian && docker attach my_debian)
Johnny Willer

128

มีวิธีต่อไปนี้เพื่อยืนยันข้อมูลคอนเทนเนอร์:

  1. ปริมาณนักเทียบท่า

  2. นักเทียบท่ากระทำ

    a) สร้าง container จากอิมเมจของ ubuntu และรัน terminal bash

       $ docker run -i -t ubuntu:14.04 /bin/bash
    

    b) ภายในแผงควบคุมการติดตั้งเทอร์มินัล

       # apt-get update
       # apt-get install curl
    

    c) ออกจากเทอร์มินัลคอนเทนเนอร์

       # exit
    

    d) จดบันทึก ID คอนเทนเนอร์ของคุณโดยดำเนินการคำสั่งต่อไปนี้:

       $ docker ps -a
    

    e) บันทึกคอนเทนเนอร์เป็นรูปภาพใหม่

       $ docker commit <container_id> new_image_name:tag_name(optional)
    

    f) ตรวจสอบว่าคุณสามารถเห็นภาพใหม่ของคุณด้วยการติดตั้งม้วนงอ

       $ docker images           
    
       $ docker run -it new_image_name:tag_name bash
          # which curl
            /usr/bin/curl
    

จำเป็นหรือไม่exitก่อนdocker commit? ขอบคุณ
Abhishek Anand

2
@AbhishekAnand ใช่เพราะด้วยdocker runคำสั่งที่คุณใช้ทุบตีในภาชนะและคุณอยู่ในนั้นเนื่องจาก-iและ-tตัวเลือก (โต้ตอบกับ TTY) อย่างไรก็ตามนักเทียบท่าทำงานบนเครื่องของคุณนอกคอนเทนเนอร์ดังนั้นหลังจากทำการเปลี่ยนแปลงที่จำเป็นกับคอนเทนเนอร์จากด้านในเพื่อกลับไปที่เชลล์ของระบบคุณต้องexit(หรือ Ctrl + D) เชลล์ของคอนเทนเนอร์ นอกจากนี้ให้สังเกต#และ$ในคำตอบซึ่งระบุเชลล์ที่ต่างกันคำสั่งนั้นถูกเขียนไป
Erik

คำถามด่วน: หากฉันไม่ยอมรับฉันจะสูญเสียข้อมูล ก็เป็นที่ชัดเจน. แต่เมื่อฉันเปลี่ยนการตั้งค่า nginx ทำไมมันยังคงอัปเดต (ไม่จำเป็นต้องผูกมัด) @Erik
grep

@grep หากคุณมี MWE ที่ชัดเจนและทำซ้ำได้โปรดถามคำถามใหม่เกี่ยวกับมันหากไม่มีกรณีการใช้งานเฉพาะนี้อยู่แล้ว
Erik

3. ตามด้วยdocker stop docker start
carillonator

59

นอกจากนี้ในการตอบ Unferth ของก็จะแนะนำการสร้างDockerfile

ในไดเรกทอรีว่างให้สร้างไฟล์ชื่อ "Dockerfile"ด้วยเนื้อหาต่อไปนี้

FROM ubuntu
RUN apt-get install ping
ENTRYPOINT ["ping"]

สร้างภาพโดยใช้ Dockerfile ลองใช้แท็กเพื่อที่เราไม่จำเป็นต้องจำหมายเลขภาพเลขฐานสิบหก

$ docker build -t iman/ping .

จากนั้นเรียกใช้รูปภาพในคอนเทนเนอร์

$ docker run iman/ping stackoverflow.com

1
ไม่ต้องทำด้วยตนเองมากกว่าหนึ่งครั้งตรงจุดของนักเทียบท่า สร้าง dockerfile ยอมรับและอัพโหลดภาพผลลัพธ์ ดึงภาพดังกล่าวไปข้างหน้า
Brandon Bertelsen

11

ฉันได้รับคำตอบที่ง่ายกว่าสำหรับคุณใช้คำสั่งสองคำสั่งต่อไปนี้

sudo docker run -t -d ubuntu --name mycontainername /bin/bash
sudo docker ps -a

คำสั่ง ps -a ข้างต้นส่งคืนรายการของคอนเทนเนอร์ทั้งหมด ใช้ชื่อของคอนเทนเนอร์ที่อ้างอิงชื่อรูปภาพ - 'ubuntu' นักเทียบท่าอัตโนมัติสร้างชื่อสำหรับคอนเทนเนอร์เช่น - 'lightlyxuyzx'นั่นคือถ้าคุณไม่ใช้ตัวเลือก - ชื่อ

ตัวเลือก -t และ -d มีความสำคัญคอนเทนเนอร์ที่สร้างถูกถอดออกและสามารถแนบใหม่ได้ตามที่ระบุด้านล่างด้วยตัวเลือก -t

ด้วยตัวเลือก - ชื่อคุณสามารถตั้งชื่อคอนเทนเนอร์ของคุณในกรณีของฉัน 'mycontainername'

sudo docker exec -ti mycontainername bash

และคำสั่งข้างต้นนี้จะช่วยให้คุณเข้าสู่คอนเทนเนอร์ด้วยเปลือกทุบ จากจุดนี้การเปลี่ยนแปลงใด ๆ ที่คุณทำในคอนเทนเนอร์จะถูกบันทึกโดยนักเทียบท่าโดยอัตโนมัติ ตัวอย่างเช่น - apt-get install curlภายในคอนเทนเนอร์คุณสามารถออกจากคอนเทนเนอร์โดยไม่มีปัญหาใด ๆ นักเทียบท่าอัตโนมัติบันทึกการเปลี่ยนแปลง

ในการใช้งานครั้งต่อไปสิ่งที่คุณต้องทำคือรันคำสั่งสองคำสั่งนี้ทุกครั้งที่คุณต้องการทำงานกับคอนเทนเนอร์นี้

คำสั่งด้านล่างนี้จะเริ่มต้นคอนเทนเนอร์ที่หยุด:

sudo docker start mycontainername

sudo docker exec -ti mycontainername bash

อีกตัวอย่างหนึ่งที่มีพอร์ตและพื้นที่แชร์ที่ระบุด้านล่าง

docker run -t -d --name mycontainername -p 5000:5000 -v ~/PROJECTS/SPACE:/PROJECTSPACE 7efe2989e877 /bin/bash

ในกรณีของฉัน: 7efe2989e877 - เป็นอิมเมจของคอนเทนเนอร์ก่อนหน้านี้ที่ฉันใช้งาน

นักเทียบท่า ps -a


4
ด้วย Docker 18.09.2 บน Ubuntu 18.04 มันไม่ทำงานอย่างที่เป็น ใช้งานได้ถ้าฉันใส่--nameตัวเลือกและตัวเลือกหน้าชื่อภาพเช่นนี้:docker run --name mycontainername -t -d ubuntu /bin/bash
Stéphane Gourichon

9

คุณอาจต้องการดูปริมาณนักเทียบท่าถ้าคุณต้องการเก็บข้อมูลในคอนเทนเนอร์ของคุณ เยี่ยมชมhttps://docs.docker.com/engine/tutorials/dockervolumes/ เอกสารนักเทียบท่าเป็นจุดเริ่มต้นที่ดีมาก


3

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

เอกสารนั้นง่ายต่อการเข้าใจดีกว่าเอกสารของนักเทียบท่า

จัดทำเอกสารนักเทียบท่า

ดีที่สุด


3

มีคำตอบที่ดีมากสำหรับคำถามที่ถามไปข้างต้น อาจไม่จำเป็นต้องมีคำตอบอื่น แต่ฉันยังต้องการแสดงความคิดเห็นส่วนตัวในหัวข้อด้วยคำที่ง่ายที่สุดเท่าที่จะเป็นไปได้

นี่คือบางจุดเกี่ยวกับคอนเทนเนอร์และรูปภาพที่จะช่วยให้เราได้ข้อสรุป:

  • ภาพนักเทียบท่าสามารถ :
    1. สร้างขึ้นจาก-a-รับภาชนะ
    2. ที่ถูกลบ
    3. ใช้เพื่อสร้าง-หมายเลขใด ๆ ของภาชนะบรรจุ
  • คอนเทนเนอร์นักเทียบท่าสามารถ :
    1. สร้างขึ้นจากที่ใช้ภาพ
    2. เริ่มต้น
    3. หยุด
    4. เริ่มต้นใหม่
    5. ที่ถูกลบ
    6. ใช้เพื่อสร้าง-หมายเลขใด ๆ ของภาพ
  • คำสั่งเรียกใช้นักเทียบท่าทำสิ่งนี้ :
    1. ดาวน์โหลดรูปภาพหรือใช้รูปภาพแคช
    2. สร้างคอนเทนเนอร์ใหม่จากมัน
    3. เริ่มคอนเทนเนอร์
  • เมื่อใช้ Dockerfile เพื่อสร้างภาพ :
    1. เป็นที่ทราบกันดีอยู่แล้วว่าในที่สุดรูปภาพจะถูกใช้เพื่อเรียกใช้คอนเทนเนอร์นักเทียบท่า
    2. หลังจากออกคำสั่งสร้างนักเทียบท่านักเทียบท่าเบื้องหลังสร้างคอนเทนเนอร์ที่รันด้วย base-file-system และทำตามขั้นตอนภายใน Dockerfile เพื่อกำหนดค่าคอนเทนเนอร์ตามที่นักพัฒนาต้องการ
    3. หลังจากคอนเทนเนอร์ถูกกำหนดค่าด้วยรายละเอียดของ Dockerfile มันจะถูกกำหนดเป็นรูปภาพ
    4. ภาพพร้อมแล้วที่จะร็อคแอนด์โรล!

สรุป :

อย่างที่เราเห็นคอนเทนเนอร์ของนักเทียบท่านั้นเป็นอิสระจากอิมเมจของนักเทียบท่า

ภาชนะสามารถเริ่มต้นใหม่ให้รหัสเฉพาะของภาชนะ[การใช้งานdocker ps --allที่จะได้รับประชาชนได้]

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

คอนเทนเนอร์ที่สร้างไว้แล้วพร้อมใช้งานสำหรับการรีสตาร์ท แต่เมื่อเราออก docker runคำสั่งคอนเทนเนอร์ใหม่จะถูกสร้างขึ้นจากอิมเมจและด้วยเหตุนี้มันจึงเป็นเหมือนระบบคอมพิวเตอร์ใหม่ การเปลี่ยนแปลงที่เกิดขึ้นภายในคอนเทนเนอร์เก่า - อย่างที่เราเข้าใจในตอนนี้ - ไม่พร้อมใช้งานในคอนเทนเนอร์ใหม่นี้

บันทึกสุดท้าย :

ฉันเดาว่ามันชัดเจนว่าทำไมข้อมูลดูเหมือนว่าจะหายไป แต่มันอยู่ที่นั่นเสมอ .. แต่ในภาชนะ [เก่า] ที่แตกต่างกัน ดังนั้นรับทราบความแตกต่างในdocker start& docker runcommand & อย่าสับสนในพวกเขา


1

ปัญหาที่คล้ายกัน (และไม่มีวิธีเดียวที่ Dockerfile สามารถแก้ไขได้) นำฉันมาที่หน้านี้

เวที 0: สำหรับทุกคนหวังว่า Dockerfile จะสามารถแก้ไขได้: จนกว่า --dns และ --dns-search จะปรากฏในการสนับสนุน Dockerfile - ไม่มีวิธีใดที่จะรวมทรัพยากรที่อิงกับอินทราเน็ตไว้ในนั้น

ขั้นตอนที่ 1: หลังจากสร้างภาพโดยใช้ Dockerfile (โดยวิธีการที่มันเป็นข้อผิดพลาดร้ายแรง Dockerfile จะต้องอยู่ในโฟลเดอร์ปัจจุบัน ) มีภาพเพื่อปรับใช้สิ่งที่อินทราเน็ตโดยใช้สคริปต์รันนักวิ่ง ตัวอย่าง: docker run -d \ --dns=${DNSLOCAL} \ --dns=${DNSGLOBAL} \ --dns-search=intranet \ -t pack/bsp \ --name packbsp-cont \ bash -c " \ wget -r --no-parent http://intranet/intranet-content.tar.gz \ tar -xvf intranet-content.tar.gz \ sudo -u ${USERNAME} bash --norc"

ขั้นที่ 2: การใช้สคริปต์เรียกใช้นักเทียบท่าในโหมด daemon ที่ให้ระเบียน dns ในเครื่องเพื่อให้สามารถดาวน์โหลดและปรับใช้อุปกรณ์ในเครื่อง

จุดสำคัญ:สคริปต์การเรียกใช้ควรลงท้ายด้วยสิ่งที่ต้องการ/usr/bin/sudo -u ${USERNAME} bash --norcให้คอนเทนเนอร์ทำงานแม้หลังจากสคริปต์การติดตั้งเสร็จสิ้น

ไม่มันเป็นไปไม่ได้ที่จะเรียกใช้ container ในโหมดอินเตอร์แอคทีฟสำหรับเรื่องระบบอัตโนมัติเต็มรูปแบบเนื่องจากมันจะยังคงอยู่ภายในภายในจะพร้อมรับคำสั่งจนกระทั่งCTRL-p CTRL-qถูกกด

ไม่ถ้าทุบตีโต้ตอบจะไม่ถูกดำเนินการในตอนท้ายของสคริปต์การติดตั้งที่เก็บจะสิ้นสุดลงทันทีหลังจากเสร็จสิ้นการดำเนินการสคริปต์การสูญเสียผลการติดตั้งทั้งหมด

ขั้นตอนที่ 3: คอนเทนเนอร์ยังคงทำงานในพื้นหลัง แต่ก็ไม่ชัดเจนว่าคอนเทนเนอร์สิ้นสุดขั้นตอนการติดตั้งหรือยัง ใช้บล็อกต่อไปนี้เพื่อพิจารณาว่าขั้นตอนการดำเนินการเสร็จสิ้น: while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done สคริปต์จะดำเนินการต่อไปหลังจากติดตั้งเสร็จสมบูรณ์เท่านั้น และนี่คือช่วงเวลาที่เหมาะสมในการโทร: ส่งมอบระบุรหัสภาชนะปัจจุบันและชื่อภาพปลายทาง (อาจเหมือนกับในกระบวนการสร้าง / เรียกใช้แต่ต่อท้ายด้วยแท็กจุดประสงค์ในการติดตั้งในเครื่องตัวอย่าง: docker commit containerID pack/bsp:toolchainedดูลิงค์นี้ วิธีการรับcontainerIDที่เหมาะสม

ขั้นตอนที่ 4:คอนเทนเนอร์ได้รับการอัปเดตด้วยการติดตั้งในท้องที่รวมถึงการกำหนดให้เป็นรูปภาพที่ได้รับมอบหมายใหม่ ตอนนี้ปลอดภัยแล้วที่จะหยุดการคอนเทนเนอร์ ตัวอย่าง:docker stop packbsp-cont

stage5:ช่วงเวลาใด ๆ ที่คอนเทนเนอร์ที่มีการติดตั้งแบบโลคัลจำเป็นต้องรันให้เริ่มด้วยภาพที่บันทึกไว้ก่อนหน้านี้ ตัวอย่าง:docker run -d -t pack/bsp:toolchained


1

คำตอบที่ยอดเยี่ยมที่นี่ วิธีการต่อนักเทียบท่าที่ออก จากผู้ใช้กิโลกรัม

docker start $(docker ps -a -q --filter "status=exited")
(or in this case just docker start $(docker ps -ql) 'cos you don't want to start all of them)

docker exec -it <container-id> /bin/bash

บรรทัดที่สองนั้นสำคัญมาก ดังนั้น exec จึงถูกใช้แทนการเรียกใช้ไม่ใช่บนภาพ แต่อยู่บน containerid และคุณทำมันหลังจากที่เริ่มภาชนะ


0

ไม่มีคำตอบใดที่ชี้ไปที่ตัวเลือกการออกแบบนี้ ฉันคิดว่านักเทียบท่าทำงานด้วยวิธีนี้เพื่อป้องกันข้อผิดพลาด 2 ข้อนี้:

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