วิธีการสร้างคอนเทนเนอร์นักเทียบท่าใน docker-compose.yml


218

มีขอบเขตของบริการที่กำหนดไว้ใน docker-compose.yml บริการเหล่านี้เริ่มต้นแล้ว ฉันจำเป็นต้องสร้างใหม่เพียงหนึ่งสิ่งเหล่านี้และเริ่มต้นโดยไม่มีบริการอื่น ๆ ฉันรันคำสั่งต่อไปนี้:

docker-compose up -d # run all services
docker-compose stop nginx # stop only one. but it still running !!!
docker-compose build --no-cache nginx 
docker-compose up -d --no-deps # link nginx to other services

ในตอนท้ายฉันได้รับ nginx container เก่า โดยนักเทียบท่าเขียนไม่ได้ฆ่าภาชนะที่ใช้งานทั้งหมด!


4
docker-compose up --build
Jinna Balu

คำตอบ:


233

นักเทียบท่าเขียนขึ้น

$docker-compose up -d --no-deps --build <service_name>

- no-deps - อย่าเริ่มบริการที่เชื่อมโยง

- สร้าง - สร้างภาพก่อนที่จะเริ่มภาชนะ


19
docker-compose build service1 service2 --no-cache ทำงานนี้ดีขึ้นหรือไม่ ( github.com/docker/compose/issues/1049 ) ฉันมีปัญหากับคอนเทนเนอร์ที่สร้างขึ้นก่อนที่จะใช้ docker-compose up -d --no-deps --build <service_name>
evgpisarchik

33
@evgpisarchik คำสั่งออกไปหน่อยน่าจะเป็นdocker-compose build --no-cache service1 service2
Matthew Wilcoxson

183

ด้วยนักเทียบท่าแต่ง 1.19 up

docker-compose up --build --force-recreate --no-deps [-d] [<service_name>..]

ไม่มีหนึ่งservice_nameอาร์กิวเมนต์ขึ้นไปคอนเทนเนอร์ทั้งหมดจะถูกสร้างใหม่

จากเมนูช่วยเหลือ

Options:
    -d, --detach        Detached mode: Run containers in the background,
                        print new container names. Incompatible with
                        --abort-on-container-exit.
    --no-deps           Don't start linked services.
    --force-recreate    Recreate containers even if their configuration
                        and image haven't changed.
    --build             Build images before starting containers.

4
ฉันสับสนว่านี่ตอบคำถามได้อย่างไร เราจะสร้างใหม่แค่คอนเทนเนอร์เดียวได้อย่างไร
ดันแคนโจนส์

11
คุณสามารถสร้างคอนเทนเนอร์เดียวได้เพียงหนึ่งรายการโดยต่อท้ายชื่อด้วยท้ายคำสั่ง docker-compose up -d --force-recreate --build container_name
HarlemSquirrel

รอสักครู่นี้จะสร้างภาชนะใหม่มันไม่เทียบเท่ากับbuild --no-cacheตัวเลือกเว้นแต่คำอธิบายคำสั่งจะผิดอย่างสมบูรณ์
Slav

67

สิ่งนี้จะแก้ไขปัญหาของคุณ:

docker-compose ps # lists all services (id, name)
docker-compose stop <id/name> #this will stop only the selected container
docker-compose rm <id/name> # this will remove the docker container permanently 
docker-compose up # builds/rebuilds all not already built container 

12
ถ้าคุณต้องการstopและภาชนะทั้งหมดแล้วคุณสามารถใช้คำสั่งrm docker-compose downทางออกของคุณดีกว่าถ้าคุณต้องการกำจัดบางอย่างเท่านั้น
hirowatari

วิธีนี้เหมาะสำหรับการตั้งค่าที่คุณไม่ต้องการหยุดแอปพลิเคชันนักเทียบท่าทั้งหมดและเพิ่งสร้างหนึ่งในบริการ
bluesummers

ฉันจำเป็นต้องเรียกใช้จริงdocker-compose build <id/name>ก่อนที่upจะสร้าง Dockerfile ที่เปลี่ยนแปลงใหม่
Vajk Hermecz

50

ในขณะที่ @HarlemSquirrel โพสต์เป็นสิ่งที่ดีที่สุดและฉันคิดว่าทางออกที่ถูกต้อง

แต่เพื่อตอบปัญหาเฉพาะของ OP มันควรเป็นคำสั่งต่อไปนี้เนื่องจากเขาไม่ต้องการสร้างบริการทั้งหมดในdocker-compose.ymlไฟล์ แต่มีเพียงnginxอย่างเดียว:

docker-compose up -d --force-recreate --no-deps --build nginx

คำอธิบายตัวเลือก:

Options:
  -d                  Detached mode: Run containers in the background,
                      print new container names. Incompatible with
                      --abort-on-container-exit.
  --force-recreate    Recreate containers even if their configuration
                      and image haven't changed.
  --build             Build images before starting containers.
  --no-deps           Don't start linked services.

9

บางทีขั้นตอนเหล่านี้อาจไม่ถูกต้อง แต่ฉันทำเช่นนี้:

หยุดนักเทียบท่าเขียน: $ docker-compose down

นำภาชนะออก: $ docker system prune -a

เริ่มนักเทียบท่าเขียน: $ docker-compose up -d


4

เพียงใช้:

docker-compose build [yml_service_name]

แทนที่[yml_service_name]ด้วยชื่อบริการของคุณในdocker-compose.ymlไฟล์ คุณสามารถใช้docker-compose restartเพื่อให้การเปลี่ยนแปลงมีผล คุณสามารถใช้--no-cacheเพื่อละเว้นแคช


2

ปัญหาคือ:

$ docker-compose stop nginx

ไม่ทำงาน (คุณบอกว่ามันยังทำงานอยู่) หากคุณจะสร้างใหม่คุณสามารถลองฆ่ามันได้:

$ docker-compose kill nginx

หากยังใช้งานไม่ได้ให้ลองหยุดโดยใช้ docker โดยตรง:

$ docker stop nginx

หรือลบทิ้ง

$ docker rm -f nginx

หากยังใช้งานไม่ได้ให้ตรวจสอบรุ่นนักเทียบท่าของคุณคุณอาจต้องการอัพเกรด

มันอาจจะเป็นข้อผิดพลาดคุณสามารถตรวจสอบว่ามีคนตรงกับระบบ / รุ่นของคุณ ต่อไปนี้เป็นตัวอย่าง: https://github.com/docker/docker/issues/10589

https://github.com/docker/docker/issues/12738

คุณสามารถลองฆ่ากระบวนการได้

$ ps aux | grep docker 
$ kill 225654 # example process id

1

สำหรับฉันมันเรียกเพียงการอ้างอิงใหม่จากหาง Hub กับทั้งสอง--no-cacheและ(ซึ่งมีอยู่สำหรับ--pulldocker-compose build

# other steps before rebuild
docker-compose build --no-cache --pull nginx # rebuild nginx
# other steps after rebuild, e.g. up (see other answers)

0
docker-compose stop nginx # stop if running
docker-compose rm -f nginx # remove without confirmation
docker-compose build nginx # build
docker-compose up -d nginx # create and start in background

การถอดภาชนะบรรจุด้วย rm เป็นสิ่งจำเป็น หากไม่ถอดออกนักเทียบท่าจะเริ่มเก็บภาชนะเก่า


-9

เท่านั้น:

$ docker-compose restart [yml_service_name]

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