ฉันมีdocker-compose.yml
ไฟล์ที่มี 4 คอนเทนเนอร์: redis, postgres, api, คนทำงาน
ในระหว่างการพัฒนาของผู้ปฏิบัติงานฉันมักต้องเริ่มต้นใหม่เพื่อใช้การเปลี่ยนแปลง มีวิธีที่ดีในการรีสตาร์ทคอนเทนเนอร์ (เช่นworker
) โดยไม่รีสตาร์ทคอนเทนเนอร์อื่นหรือไม่?
ฉันมีdocker-compose.yml
ไฟล์ที่มี 4 คอนเทนเนอร์: redis, postgres, api, คนทำงาน
ในระหว่างการพัฒนาของผู้ปฏิบัติงานฉันมักต้องเริ่มต้นใหม่เพื่อใช้การเปลี่ยนแปลง มีวิธีที่ดีในการรีสตาร์ทคอนเทนเนอร์ (เช่นworker
) โดยไม่รีสตาร์ทคอนเทนเนอร์อื่นหรือไม่?
คำตอบ:
มันง่ายมาก: ใช้คำสั่ง:
docker-compose restart worker
คุณสามารถตั้งเวลาให้รอก่อนที่จะฆ่าตู้สินค้า (เป็นวินาที)
docker-compose restart -t 30 worker
โปรดทราบว่าสิ่งนี้จะรีสตาร์ทคอนเทนเนอร์ แต่ไม่มีการสร้างใหม่ หากคุณต้องการใช้การเปลี่ยนแปลงของคุณแล้วรีสตาร์ทลองดูคำตอบอื่น ๆ
docker-compose restart
คำสั่งจะไม่ใช้การเปลี่ยนแปลงใด ๆ "หากคุณทำการเปลี่ยนแปลงการdocker-compose.yml
ตั้งค่าของคุณการเปลี่ยนแปลงเหล่านี้จะไม่ปรากฏหลังจากเรียกใช้คำสั่งนี้" docker-compose up -d --build
ดังนั้นใช้ docs.docker.com/compose/reference/restart
docker ps -a
restart
ไม่ใช้การเปลี่ยนแปลงแม้ว่าคุณจะเรียกใช้แล้วdocker-compose build <container name>
และนี่เป็นคำตอบที่ไม่ทำงาน / ไม่ถูกต้อง
คำตอบอื่น ๆ สำหรับการรีสตาร์ทโหนดเดียวนั้นอยู่ที่เป้าหมาย, 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
ตัวมันเองก็ยังไม่เปลี่ยน
COPY
คำสั่งนั่นจะทำให้แคชเสียหายโดยอัตโนมัติ
COPY
คำสั่งใน Dockerfile แล้ว กระบวนการgit pull
จะอัปเดตไฟล์ package.json และบิลด์แคชจะหยุดทำงานเมื่อนักเทียบท่าเห็นว่าคุณคัดลอกในไฟล์อื่น
ADD
แทนCOPY
แต่เห็นได้ชัดว่าหลังเป็นแนวปฏิบัติที่ดีที่สุดดังนั้นฉันจะลองดู!
ADD
จะมีผลเช่นเดียวCOPY
กับที่แคช bust แต่ (ตามที่แนะนำในลิงค์ปฏิบัติที่ดีที่สุด) ส่วนใหญ่ไม่ต้องการความสามารถพิเศษดังนั้นฉันจึงไม่ต้องพูดถึง
หากต้องการเริ่มบริการที่มีการเปลี่ยนแปลงใหม่นี่คือขั้นตอนที่ฉันดำเนินการ:
docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker
docker-compose up -d --build
และมันจะสร้างทุกอย่างและรีสตาร์ทภาชนะที่เปลี่ยนแปลงใด ๆ ไม่จำเป็นต้องหยุดก่อนด้วยการหยุดทำงานและแยกคำสั่งสร้างและเริ่มต้น
up
จะสร้างคอนเทนเนอร์ที่เปลี่ยนแปลงเท่านั้นดังนั้นจึงจำเป็นต้องรีสตาร์ท
คำสั่งดังต่อไปนี้
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
rm
ตัวเลือกบรรทัด-f
มาสะดวก (ไม่พร้อมท์) และกับนักเทียบท่าปัจจุบันcreate
และstart
รวมเป็นup
(ดังนั้นโดยรวมแล้วเรามี 3 คำสั่งไม่ใช่ 4) และสำหรับup
ตัวเลือก-d
มีประโยชน์ (การดำเนินการอยู่ในพื้นหลัง)
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
คำสั่ง 'นักเทียบท่า' แบบเรียบง่ายไม่รู้อะไรเกี่ยวกับคอนเทนเนอร์ 'ผู้ปฏิบัติงาน' ใช้คำสั่งแบบนี้
docker-compose -f docker-compose.yml restart worker
หากคุณต้องการรีสตาร์ทคอนเทนเนอร์ของคุณ:
docker-compose restart servicename
คิดว่าคำสั่งนี้เป็น "เพิ่งรีสตาร์ทคอนเทนเนอร์ด้วยชื่อ" ซึ่งเทียบเท่ากับ docker restart
คำสั่ง
หากคุณเปลี่ยนตัวแปร ENV พวกเขาจะไม่อัปเดตในคอนเทนเนอร์ คุณต้องหยุดมันและเริ่มใหม่อีกครั้ง หรือการใช้คำสั่งเดียวdocker-compose up
จะตรวจจับการเปลี่ยนแปลงและสร้างคอนเทนเนอร์ใหม่
ดังที่คนอื่น ๆ พูดถึงถ้าคุณเปลี่ยนdocker-compose.yml
ไฟล์ตัวเองการรีสตาร์ทอย่างง่ายจะไม่นำการเปลี่ยนแปลงเหล่านั้นมาใช้
หากคุณคัดลอกรหัสของคุณภายในคอนเทนเนอร์ที่ขั้นตอนการสร้าง (ในการDockerfile
ใช้ADD
หรือCOPY
คำสั่ง) ทุกครั้งที่การเปลี่ยนแปลงรหัสคุณต้องสร้างคอนเทนเนอร์ใหม่ ( docker-compose build
)
docker-compose restart
ควรจะทำงานได้อย่างสมบูรณ์ถ้าโค้ดของคุณได้รับการแมปลงในคอนเทนเนอร์โดยไดรฟ์ข้อมูลคำสั่งdocker-compose.yml
เช่น:
services:
servicename:
volumes:
- .:/code
แต่ฉันขอแนะนำให้ใช้การโหลดรหัสสดซึ่งอาจมาจากกรอบที่คุณเลือกในโหมด DEBUG (หรือคุณสามารถค้นหาแพ็คเกจการบรรจุอัตโนมัติในภาษาที่คุณต้องการ) การเพิ่มสิ่งนี้ควรลดความจำเป็นในการรีสตาร์ทคอนเทนเนอร์ทุกครั้งหลังจากเปลี่ยนรหัสของคุณแทนที่จะโหลดกระบวนการใหม่ภายใน
คำตอบของที่นี่กำลังพูดถึงภาพสะท้อนของการเปลี่ยนแปลงในไฟล์ docker-compose.yml
แต่ถ้าฉันต้องการรวมการเปลี่ยนแปลงที่ฉันได้ทำในรหัสของฉันและฉันเชื่อว่ามันจะเป็นไปได้โดยการสร้างภาพขึ้นมาใหม่และฉันทำตามคำสั่งต่อไปนี้
1. หยุดนักเทียบท่าคอนเทนเนอร์
docker stop container-id
2. การกำจัดภาชนะนักเทียบท่า
docker rm container-id
3. การกำจัดภาพนักเทียบท่า
docker rmi image-id
4. เขียนคอนเทนเนอร์อีกครั้ง
docker-compose up container-name