วิธีรีสตาร์ทคอนเทนเนอร์เดียวที่มีตัวเชื่อมต่อประกอบด้วย


333

ฉันมีdocker-compose.ymlไฟล์ที่มี 4 คอนเทนเนอร์: redis, postgres, api, คนทำงาน

ในระหว่างการพัฒนาของผู้ปฏิบัติงานฉันมักต้องเริ่มต้นใหม่เพื่อใช้การเปลี่ยนแปลง มีวิธีที่ดีในการรีสตาร์ทคอนเทนเนอร์ (เช่นworker) โดยไม่รีสตาร์ทคอนเทนเนอร์อื่นหรือไม่?


2
docker-compose -f docker-compose.yml ผู้ปฏิบัติงานรีสตาร์ท
Jinna Balu

คำตอบ:


398

มันง่ายมาก: ใช้คำสั่ง:

docker-compose restart worker

คุณสามารถตั้งเวลาให้รอก่อนที่จะฆ่าตู้สินค้า (เป็นวินาที)

docker-compose restart -t 30 worker

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


3
สำหรับฉันมันใช้งานได้ แต่คำถามทั่วไปถ้าอนุญาตที่นี่: 'เริ่มใหม่' ดูแลคอนเทนเนอร์ที่เชื่อมโยงและอัปเดต / etc / hosts หรือไม่ 'เริ่มใหม่' เปลี่ยน IP ใด ๆ เลยหรือไม่
michabbb

คอนเทนเนอร์เชื่อมโยงโดยใช้ชื่อและโดยทั่วไป IP เดียวที่คุณต้องกังวลคือ IP host docker ภายนอก (ปกติคือ 192.168.99.100) ในกรณีที่อาจมีปัญหาได้ถ้าคุณบอกให้รีสตาร์ทคอนเทนเนอร์ฐานข้อมูลที่คอนเทนเนอร์อื่นเชื่อมต่ออยู่ คอนเทนเนอร์ที่ขึ้นต่อกันนั้นจะต้องมีความยืดหยุ่นเพียงพอที่จะเชื่อมต่อใหม่
Ryan Kimber

20
OP ระบุว่าเขาต้องการ "เริ่มใหม่เพื่อใช้การเปลี่ยนแปลง" ตามเอกสารdocker-compose restartคำสั่งจะไม่ใช้การเปลี่ยนแปลงใด ๆ "หากคุณทำการเปลี่ยนแปลงการdocker-compose.ymlตั้งค่าของคุณการเปลี่ยนแปลงเหล่านี้จะไม่ปรากฏหลังจากเรียกใช้คำสั่งนี้" docker-compose up -d --buildดังนั้นใช้ docs.docker.com/compose/reference/restart
featherbelly

5
nb, คนงานคือชื่อที่กำหนดให้กับบริการในไฟล์ yaml และไม่ใช่สิ่งที่คุณเห็นเมื่อใช้งานdocker ps -a
worc

2
คำตอบอื่น ๆ นี้ดีกว่าstackoverflow.com/a/39501539/292408เนื่องจากrestartไม่ใช้การเปลี่ยนแปลงแม้ว่าคุณจะเรียกใช้แล้วdocker-compose build <container name>และนี่เป็นคำตอบที่ไม่ทำงาน / ไม่ถูกต้อง
Elijah Lynn

170

คำตอบอื่น ๆ สำหรับการรีสตาร์ทโหนดเดียวนั้นอยู่ที่เป้าหมาย, docker-compose restart worker. นั่นจะเด้งคอนเทนเนอร์นั้น แต่ไม่รวมการเปลี่ยนแปลงใด ๆ แม้ว่าคุณจะสร้างใหม่แยกต่างหาก คุณสามารถด้วยตนเองstop, rm, createและstartแต่มีวิธีการง่ายมาก

หากคุณได้อัปเดตรหัสของคุณคุณสามารถสร้างและโหลดใหม่ได้ในขั้นตอนเดียวด้วย:

docker-compose up --detach --build

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

docker-compose pull

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

และในการทำเช่นนี้สำหรับบริการเดียวให้ทำตามคำสั่ง up หรือ pull ด้วยบริการที่คุณต้องการระบุเช่น:

docker-compose up --detach --build worker

ต่อไปนี้เป็นตัวอย่างด่วนของตัวเลือกแรก Dockerfile ได้รับการจัดโครงสร้างเพื่อให้ส่วนต่าง ๆ ที่เปลี่ยนแปลงบ่อยของรหัสใกล้ถึงจุดสิ้นสุด ในความเป็นจริงข้อกำหนดถูกดึงแยกต่างหากสำหรับpip installเนื่องจากไฟล์นั้นไม่ค่อยเปลี่ยนแปลง และเนื่องจากคอนเทนเนอร์ nginx และ redis เป็นข้อมูลล่าสุดพวกเขาจึงไม่ถูกรีสตาร์ท เวลาทั้งหมดสำหรับกระบวนการทั้งหมดอยู่ภายใต้ 6 วินาที:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s

สิ่งนี้น่าสนใจ แต่สามารถใช้ร่วมกับ-no-cacheตัวเลือกได้หรือไม่ บอกว่าฉันเพิ่มบางสิ่งบางอย่างลงในของฉันpackage.jsonและต้องการอีกครั้งRUN npm installแต่Dockerfileตัวมันเองก็ยังไม่เปลี่ยน
Augustin Riedinger

2
@augustinriedinger หากไฟล์อินพุตของคุณเปลี่ยนไปและคุณรวมไฟล์นั้นไว้ในCOPYคำสั่งนั่นจะทำให้แคชเสียหายโดยอัตโนมัติ
BMitch

1
@augustinriedinger ขอบคุณ ฉันโทรศัพท์มือถือฉันจึงไม่เห็นคำถามที่เชื่อมโยง จากขั้นตอนในคำถามของคุณคุณควรมีCOPYคำสั่งใน Dockerfile แล้ว กระบวนการgit pullจะอัปเดตไฟล์ package.json และบิลด์แคชจะหยุดทำงานเมื่อนักเทียบท่าเห็นว่าคุณคัดลอกในไฟล์อื่น
BMitch

1
ขอบคุณไม่ทราบเกี่ยวกับพฤติกรรมนี้! ฉันใช้ADDแทนCOPYแต่เห็นได้ชัดว่าหลังเป็นแนวปฏิบัติที่ดีที่สุดดังนั้นฉันจะลองดู!
Augustin Riedinger

1
@augustinriedinger ADDจะมีผลเช่นเดียวCOPYกับที่แคช bust แต่ (ตามที่แนะนำในลิงค์ปฏิบัติที่ดีที่สุด) ส่วนใหญ่ไม่ต้องการความสามารถพิเศษดังนั้นฉันจึงไม่ต้องพูดถึง
BMitch

28

หากต้องการเริ่มบริการที่มีการเปลี่ยนแปลงใหม่นี่คือขั้นตอนที่ฉันดำเนินการ:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker

10
หากคุณต้องการการเปลี่ยนแปลงที่จะนำไปใช้กับการสร้างคุณสามารถทำได้อย่างง่ายดายdocker-compose up -d --buildและมันจะสร้างทุกอย่างและรีสตาร์ทภาชนะที่เปลี่ยนแปลงใด ๆ ไม่จำเป็นต้องหยุดก่อนด้วยการหยุดทำงานและแยกคำสั่งสร้างและเริ่มต้น
BMitch

4
ใช่ถ้าคุณต้องการรีสตาร์ทบริการทั้งหมด แต่ OP ต้องการเริ่มบริการเดียวเท่านั้นและไม่รีสตาร์ทบริการอื่น ๆ
Jeff

3
ดูคำตอบที่ฉันโพสต์ในตัวอย่างupจะสร้างคอนเทนเนอร์ที่เปลี่ยนแปลงเท่านั้นดังนั้นจึงจำเป็นต้องรีสตาร์ท
BMitch

18

คำสั่งดังต่อไปนี้

docker-compose restart worker

จะหยุดและเริ่มภาชนะ ie โดยไม่โหลดการเปลี่ยนแปลงใด ๆ จาก docker-compose.xml

STOP คล้ายกับการไฮเบอร์เนตในพีซี ดังนั้นหยุด / เริ่มจะไม่มองหาการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นในไฟล์กำหนดค่า ในการโหลดซ้ำจากสูตรของคอนเทนเนอร์ (docker-compose.xml) เราจำเป็นต้องลบและสร้างคอนเทนเนอร์ (คล้ายกับรีบูตเครื่อง PC)

ดังนั้นคำสั่งจะเป็นดังต่อไปนี้

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation

+1 ขอบคุณมาก! สำหรับrmตัวเลือกบรรทัด-fมาสะดวก (ไม่พร้อมท์) และกับนักเทียบท่าปัจจุบันcreateและstartรวมเป็นup(ดังนั้นโดยรวมแล้วเรามี 3 คำสั่งไม่ใช่ 4) และสำหรับupตัวเลือก-dมีประโยชน์ (การดำเนินการอยู่ในพื้นหลัง)
astrowalker

10

บริการเริ่มต้นใหม่ด้วยไฟล์เขียนนักเทียบท่า

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

ใช้กรณี # 1:ถ้า COMPOSE_FILE_NAME เป็นdocker-compose.ymlและบริการคือผู้ปฏิบัติงาน

docker-compose restart worker

ใช้กรณี # 2:หากชื่อไฟล์คือsample.ymlและบริการเป็นผู้ปฏิบัติงาน

docker-compose -f sample.yml restart worker

โดยนักเทียบท่าเริ่มต้นประกอบด้วยการค้นหาdocker-compose.ymlถ้าเราเรียกใช้docker-composeคำสั่งอื่นเรามีการตั้งค่าสถานะเพื่อให้ชื่อไฟล์ที่เฉพาะเจาะจงด้วย-f [FILE_NAME].yml


7

คำสั่ง 'นักเทียบท่า' แบบเรียบง่ายไม่รู้อะไรเกี่ยวกับคอนเทนเนอร์ 'ผู้ปฏิบัติงาน' ใช้คำสั่งแบบนี้

docker-compose -f docker-compose.yml restart worker


4
ไม่ทำงาน - การเปลี่ยนแปลงใหม่ของ coker-compose.yml ไม่ได้ถูกนำไปใช้เมื่อรีสตาร์ท
jlee

3

รีสตาร์ทคอนเทนเนอร์

หากคุณต้องการรีสตาร์ทคอนเทนเนอร์ของคุณ:

docker-compose restart servicename

คิดว่าคำสั่งนี้เป็น "เพิ่งรีสตาร์ทคอนเทนเนอร์ด้วยชื่อ" ซึ่งเทียบเท่ากับ docker restartคำสั่ง

ข้อควรทราบ:

  1. หากคุณเปลี่ยนตัวแปร ENV พวกเขาจะไม่อัปเดตในคอนเทนเนอร์ คุณต้องหยุดมันและเริ่มใหม่อีกครั้ง หรือการใช้คำสั่งเดียวdocker-compose upจะตรวจจับการเปลี่ยนแปลงและสร้างคอนเทนเนอร์ใหม่

  2. ดังที่คนอื่น ๆ พูดถึงถ้าคุณเปลี่ยนdocker-compose.ymlไฟล์ตัวเองการรีสตาร์ทอย่างง่ายจะไม่นำการเปลี่ยนแปลงเหล่านั้นมาใช้

  3. หากคุณคัดลอกรหัสของคุณภายในคอนเทนเนอร์ที่ขั้นตอนการสร้าง (ในการDockerfileใช้ADDหรือCOPYคำสั่ง) ทุกครั้งที่การเปลี่ยนแปลงรหัสคุณต้องสร้างคอนเทนเนอร์ใหม่ ( docker-compose build)

ความสัมพันธ์กับรหัสของคุณ

docker-compose restartควรจะทำงานได้อย่างสมบูรณ์ถ้าโค้ดของคุณได้รับการแมปลงในคอนเทนเนอร์โดยไดรฟ์ข้อมูลคำสั่งdocker-compose.ymlเช่น:

services:

  servicename:
    volumes:
      - .:/code

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


1

คำตอบของที่นี่กำลังพูดถึงภาพสะท้อนของการเปลี่ยนแปลงในไฟล์ docker-compose.yml

แต่ถ้าฉันต้องการรวมการเปลี่ยนแปลงที่ฉันได้ทำในรหัสของฉันและฉันเชื่อว่ามันจะเป็นไปได้โดยการสร้างภาพขึ้นมาใหม่และฉันทำตามคำสั่งต่อไปนี้

1. หยุดนักเทียบท่าคอนเทนเนอร์

docker stop container-id

2. การกำจัดภาชนะนักเทียบท่า

docker rm container-id

3. การกำจัดภาพนักเทียบท่า

docker rmi image-id

4. เขียนคอนเทนเนอร์อีกครั้ง

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