วิธีที่เหมาะสมเพื่อให้นักเทียบท่าเริ่มต้นเมื่อใช้สำหรับงานตามระยะเวลา


41

ฉันมีตัวเทียบท่าพร้อมซอฟต์แวร์ที่ติดตั้งและกำหนดค่า

ไม่มีโปรแกรมใด ๆ ที่ควรจะเริ่ม / เรียกใช้ตลอดเวลา

สิ่งที่ฉันต้องการ - ความสามารถในการเริ่มต้นคำสั่งบางอย่างขึ้นอยู่กับเหตุการณ์ภายนอก ชอบ:

docker exec mysupercont /path/to/mycommand -bla -for

และ

docker exec mysupercont /path/to/myothercommand 

แต่เป็น "exec" เป็นไปไม่ได้เมื่อคอนเทนเนอร์หยุดทำงานและคอนเทนเนอร์นี้มีข้อมูล "ทำงาน" อยู่ภายในซึ่งใช้สำหรับคำสั่งนั้นดังนั้นฉันจึงไม่สามารถใช้

docker run ...

แต่ละครั้งเพราะมันสร้างที่เก็บจากภาพและทำลายข้อมูลของฉัน

อะไรคือ "สิทธิ" และ "วิธีที่ดีที่สุด" ในการเก็บรักษาตู้คอนเทนเนอร์ไว้ คำสั่งใดที่ฉันสามารถเริ่มต้นภายใน


นี่เป็นคำถามที่อธิบายได้ดีมาก ดูโพสต์อื่นที่คล้ายกันที่นี่
Grant Li

1
docker run -d --name=name container tail -f /dev/null
steampowered

คำตอบ:


46

docker runคุณไม่จำเป็นต้องดำเนินการในแต่ละครั้ง

docker run จริง ๆ แล้วเป็นลำดับของสองคำสั่ง: "สร้าง" และ "เริ่มต้น"

เมื่อคุณเรียกใช้คอนเทนเนอร์คุณต้องระบุ " -it":

-i, --interactive = false เปิด STDIN แม้ว่าจะไม่ได้แนบ
-t, --tty = false จัดสรรหลอก -TTY

ตัวอย่าง:

docker run -it debian:stable bash

หลังจากงานเสร็จสมบูรณ์คำสั่งระบุเมื่อเริ่มต้น (ในตัวอย่างทุบตีของฉัน) ตัวอย่างเช่นคุณทำ "ทางออก" คอนเทนเนอร์หยุด:

CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS                     PORTS               NAMES
1329c99a831b        debian:stable              "bash"                 51 seconds ago      Exited (0) 1 seconds ago                       goofy_bardeen

ตอนนี้คุณสามารถเริ่มได้อีกครั้ง

docker start 1329c99a831b

คอนเทนเนอร์เริ่มต้นขึ้นและดำเนินการคำสั่ง "bash" อีกครั้ง
เชื่อมต่อกับเซสชั่นนี้ "ทุบตี" ด้วยคำสั่ง

docker attach 1329c99a831b

ในการสรุป : คุณต้องเข้าใจความแตกต่างระหว่างrunและstartคอนเทนเนอร์
นอกจากนี้ให้ดูเอกสารประกอบสำหรับบทบาทของพารามิเตอร์ " -i t" และ " -d" สำหรับ "Run"


1
อ่าฉันเข้าใจเรื่องนี้ คำถามคือ: ฉันไม่มีอะไรที่จะทำงานในคอนเทนเนอร์ แต่ฉันต้องการให้มันอยู่ในสถานะ "run" ดังนั้นคำตอบของคุณคือ - ใช้ bash เพื่อเก็บคอนเทนเนอร์ในสถานะกำลังทำงานหรือไม่?
Korjavin Ivan

ใช่กระบวนการที่คุณระบุ ณ รันไทม์จะต้องทำงานกับคอนเทนเนอร์อย่างต่อเนื่องเพื่อให้ทำงานได้ ตัวอย่างที่ง่ายที่สุดคือทุบตี บางทีคุณอาจจะเป็นวิธีที่ง่ายที่สุดในการเริ่มต้นภาชนะที่มี "-d" docker attach IDและเชื่อมต่อกับมันได้ตามต้องการใช้ ออกจากเซสชั่นนี้โดยไม่ต้องทุบตีคุณสามารถใช้CTRL-p CTRL-q
MSemochkin

กระบวนการที่คุณระบุในระหว่างการเรียกใช้คอนเทนเนอร์ได้รับ PID 1 ดังนั้นคอนเทนเนอร์ก็ไม่สามารถทำงานได้หากไม่มี☺
MSemochkin

ประสบการณ์ของฉันในการเริ่มและแนบ (หรือเริ่มต้นด้วย -ai) คือการแก้ไขพรอมต์และการโต้ตอบของบรรทัดคำสั่งของคุณ EG tty ไม่ได้ถูกเรนเดอร์หรือสะท้อน
dlamblin

1
นี่คือดี โปรดทราบว่าหากคุณต้องการเริ่มต้นคอนเทนเนอร์ในพื้นหลังโดยไม่ต้องเริ่มต้นด้วยตนเองอีกครั้ง (เช่นถ้าคุณใช้บริการเว็บ) ให้ใช้พารามิเตอร์ '-itd' และ CTRL-p CTRL-q เพื่อแยกโดยไม่หยุด ภาชนะ
taranaki

6

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

แต่ความคิดเห็นสุดท้ายของ taranaki ใช้ '-itd' ดูเหมือนว่าจะเป็นสิ่งที่นักเทียบท่าสั่ง

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


2
+1 "ดูเหมือนจะเป็นสิ่งที่นักเทียบท่าสั่ง" :-)
Matt Alexander

5

เนื่องจากคุณพูดถึงงานประจำและคุณอาจใช้ cron เพราะวิธีที่คุณต้องการใช้docker execฉันมียาให้คุณเท่านั้น อย่างน้อยฉันก็ลงมือทำอะไรแบบนี้

  1. Dockerfile

    FROM <some base>
    CMD tail -f /dev/null
    
  2. ทำงานด้วยปกติdocker run -d ....(ฉันใช้docker-compose)

  3. ตั้งค่าเครื่องโฮสต์ crontab ตัวอย่างเช่น:

    * * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1
    * * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1
    

ฉันพบว่าวิธีนี้ดีมากเมื่อเราพึ่งพา crontab ที่เก่าแก่และได้รับการพิสูจน์แล้วในสภาพแวดล้อมของ linux ที่เป็นค่าเริ่มต้นในขณะที่ Docker จัดการกับตรรกะทางธุรกิจของคุณและตัวแปรสภาพแวดล้อมที่แปลกใหม่ นอกจากนี้คุณยังสามารถตั้งค่าขีด จำกัด บางอย่างถ้างานตามงวดของคุณค้าง & มีการรั่วไหลของหน่วยความจำหรืออะไรก็ตาม


0

Tail ยังคงทำให้การทำงานของไฟล์เป็นครั้งคราว

นี่คือทางออกของฉันที่จะนอนหลับตลอดไปโดยไม่มีผลข้างเคียงใด ๆ

# Ah, ha, ha, ha, stayin' alive...
while true; do :; done & kill -STOP $! && wait $!

มันทำงานอย่างไร

while true; do :; done & # do nothing(:) in background, in an endless loop
kill -STOP $!            # stop the background process of doing nothing
wait $!                  # wait forever, because doing nothing process is stopped

1
ยากที่จะเข้าใจในสิ่งที่มันทำ ทำไมไม่นอนเพียง 3650d
Pieter

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