นักวิ่ง -> 'ชื่อมีการใช้งานแล้วโดยภาชนะ'


387

การรันdockerรีจิสตรีด้วยคำสั่งด้านล่างจะมีข้อผิดพลาดเกิดขึ้นเสมอ:

dev:tmp me$ docker run \
     -d --name registry-v1 \
     -e SETTINGS_FLAVOR=local \
     -e STORAGE_PATH=/registry \
     -e SEARCH_BACKEND=sqlalchemy \
     -e LOGLEVEL=DEBUG \
     -p 5000:5000 \
     registry:0.9.1
Error response from daemon: Conflict. The name "registry-v1" is already in use by container f9e5798a82e0. You have to delete (or rename) that container to be able to reuse that name.

จะป้องกันข้อผิดพลาดนี้ได้อย่างไร?

คำตอบ:


427

ฉันสับสนด้วยเช่นกัน มีสองคำสั่งที่เกี่ยวข้องที่นี่:

นักเรียกใช้เรียกใช้คำสั่งในคอนเทนเนอร์ใหม่

เริ่มต้นนักเทียบท่าเริ่ม คอนเทนเนอร์ที่หยุดทำงานตั้งแต่หนึ่งรายการขึ้นไป


8
นี่คือคำตอบที่ฉันต้องการเพื่อเรียกใช้คอนเทนเนอร์ Docker อีกครั้ง ขอบคุณ!
isapir

105
ดังนั้นสิ่งสำคัญคือต้องใช้docker ps -aเพื่อดูคอนเทนเนอร์ทั้งหมดในกรณีนี้
Sławosz

9
ใช่เป็นคำสั่งที่คุณสามารถใช้เพื่อเริ่มต้นภาชนะที่ได้รับการสร้างขึ้นด้วยdocker start -a container-name docker runหมายเหตุธงซึ่งเป็นชวเลข-a --attachวิธีนี้คอนเทนเนอร์เริ่มต้นในส่วนหน้าเช่นเดียวกับเมื่อคุณใช้docker run(ซึ่งเรียกใช้คอนเทนเนอร์ในส่วนหน้าตามค่าเริ่มต้น)
Krzysztof Wołowski

1
@Suncatcher ใช่
0x7d7b

1
@ eMPee584 ไม่เพราะdocker create สร้างที่เก็บแต่ไม่เรียกใช้
0x7d7b

182

docker run --name registry-v1 ...นั่นหมายความว่าคุณได้เริ่มต้นแล้วภาชนะในอดีตกับพารามิเตอร์

คุณต้องลบก่อนก่อนจึงจะสามารถสร้างคอนเทนเนอร์ที่มีชื่อเดียวกันdocker rm registry-v1ได้ เมื่อคอนเทนเนอร์นั้นเริ่มทำงานคุณจำเป็นต้องหยุดมันก่อนที่คุณจะสามารถลบมันdocker stop registry-v1ได้ หรือเพียงเลือกชื่ออื่นสำหรับคอนเทนเนอร์ใหม่

docker ps -aที่จะได้รับรายชื่อของภาชนะบรรจุที่มีอยู่และชื่อของพวกเขาเพียงแค่เรียกใช้


4
แต่ทำไมคนที่หยุดเพื่อ? หรืออะไรดีถ้าพวกเขายังคงอยู่ที่นั่นถ้าพวกเขาหยุด?
mskw

2
ดังนั้นคุณสามารถเรียกใช้ได้ในภายหลังโดยไม่ต้องสร้างใหม่
Scott Stensland

2
โดยพื้นฐานแล้วคุณกำลังพูดว่า "เพื่อให้คุณสามารถเรียกใช้รูปภาพครั้งเดียว (เช่นสร้างคอนเทนเนอร์จากนั้นเรียกใช้คำสั่งในนั้น) จากนั้นเริ่มคอนเทนเนอร์ได้หลายครั้งตามที่คุณต้องการ" แต่ทำไมเราถึงต้องเรียกใช้ RUN บางสิ่งเพียงครั้งเดียว โดยไม่ต้องแม้แต่ยืนยันการเปลี่ยนแปลงที่เป็นไปได้ที่ "สิ่ง" ที่ทำกับภาชนะ (จำไว้ว่าการเปลี่ยนแปลงสถานะของนักเทียบท่าภาชนะจะหายไปเว้นแต่มุ่งมั่น)
Maksim Gumerov

14
ถ้าคุณรู้ชื่อของคอนเทนเนอร์คุณสามารถลบออกได้โดยใช้ทางลัดนี้docker rm $(docker ps -aq --filter name=myContainerName)
Jujhar Singh

2
@JujharSingh ทำไมไม่เท่านั้นdocker rm myContainerName?
Rodrigo

152

ที่นี่สิ่งที่ฉันทำมันทำงานได้ดี

ขั้นตอนที่ 1: (จะแสดงรายการคอนเทนเนอร์นักเทียบท่าพร้อมชื่อ)

docker ps -a

ขั้นตอนที่ 2:

docker rm name_of_the_docker_container

4
สิ่งนี้มีประโยชน์สำหรับฉัน "นักเทียบท่า PS" โดยไม่จำเป็นต้องใช้แฟล็ก -a เพื่อส่งคืนสิ่งใด ๆ
MichaelChan

ps docker คืนค่าการเรียกใช้คอนเทนเนอร์และต้องการ -a เพื่อแสดงรายการแม้แต่รายการที่หยุด
Surendra Pratap

57

เพียงเพื่ออธิบายสิ่งที่คนอื่นพูด (ใช้เวลาพอเข้าใจ) คือเมื่อคุณเห็นข้อผิดพลาดนี้ก็หมายความว่าคุณมีภาชนะแล้วและสิ่งที่คุณต้องทำคือเรียกใช้ ในขณะที่สัญชาตญาณdocker runควรจะเรียกใช้มันไม่ได้ คำสั่งdocker runจะใช้เพื่อเริ่มคอนเทนเนอร์เท่านั้นเป็นครั้งแรก docker start $container-nameเมื่อต้องการเรียกใช้ภาชนะที่มีอยู่สิ่งที่คุณต้องการ มากสำหรับการขอให้นักพัฒนาเพื่อสร้างคำสั่งที่มีความหมาย / ใช้งานง่าย


32

คุณมี 2 ตัวเลือกในการแก้ไขปัญหานี้ ...

  1. ลบคอนเทนเนอร์ก่อนหน้าโดยใช้ชื่อนั้นพร้อมกับคำสั่ง docker rm $(docker ps -aq --filter name=myContainerName)

    หรือ

  2. เปลี่ยนชื่อคอนเทนเนอร์ปัจจุบันเป็นชื่ออื่นเช่นเปลี่ยนส่วนนี้เป็นชื่อ --name registry-v1อื่น --name myAnotherContainerName

คุณได้รับข้อผิดพลาดนี้เนื่องจากชื่อคอนเทนเนอร์ (เช่นregistry-v1) นั้นเคยใช้โดยคอนเทนเนอร์อื่นในอดีต ... ถึงแม้ว่าคอนเทนเนอร์นั้นอาจมีการออกเช่น (ปัจจุบันไม่ได้ใช้งาน)


30

เมื่อคุณสร้างภาพใหม่คุณมักจะต้องการเรียกใช้คอนเทนเนอร์ใหม่ทุกครั้งและใช้ชื่อเดียวกัน ฉันพบวิธีที่ง่ายที่สุดคือเริ่มคอนเทนเนอร์ด้วยตัวเลือก--rm :

--rm        Automatically remove the container when it exits

เช่น

docker run --name my-micro-service --rm <image>

น่าเศร้าที่มันถูกใช้แบบสุ่มในตัวอย่างจากเอกสาร


ภาพหรือภาชนะบรรจุ?
Pim Heijden

1
ตู้คอนเทนเนอร์ถูกเรียกใช้จากภาพที่สร้างขึ้น คล้าย ๆ กับคำจำกัดความของคลาส (รูปภาพ) และอินสแตนซ์ของคลาส (คอนเทนเนอร์)
มาร์ติน

ก่อนอื่นคุณพูดว่า container จากนั้นรูปภาพ ไม่ชัดเจน --rmนอกจากนี้หากภาชนะสำหรับภาพที่ใช้แล้วมันจะยังคงทำงานหลังการใช้ มันไม่รีสตาร์ท
Pim Heijden

4
เพียงแค่ทราบ: --rmใช้งานได้เฉพาะเมื่อคุณสร้างคอนเทนเนอร์โดยใช้--rmแฟล็ก ซึ่งหมายความว่าหากคุณสร้างคอนเทนเนอร์โดยไม่มีการ--rmตั้งค่าสถานะคุณจะต้องลบออกด้วยตนเองก่อนที่คุณจะสามารถใช้ประโยชน์จากการrmตั้งค่าสถานะ
lepe

18

สาเหตุ

คอนเทนเนอร์ที่มีชื่อเดียวกันยังคงมีอยู่

สารละลาย

หากต้องการใช้ชื่อคอนเทนเนอร์เดิมอีกครั้งให้ลบคอนเทนเนอร์ที่มีอยู่โดย:

docker rm <container name>

คำอธิบาย

ภาชนะบรรจุสามารถมีอยู่ในสถานะต่อไปนี้ในระหว่างที่ไม่สามารถใช้ชื่อคอนเทนเนอร์สำหรับคอนเทนเนอร์อื่น:

  • created
  • restarting
  • running
  • paused
  • exited
  • dead

คุณสามารถดูคอนเทนเนอร์ในrunningสถานะโดยใช้:

docker ps

หากต้องการแสดงคอนเทนเนอร์ในทุกรัฐและดูว่ามีการใช้ชื่อคอนเทนเนอร์หรือไม่ให้ใช้:

docker ps -a

หากมีความประสงค์ที่จะใช้ภาชนะอีกครั้ง --rm ไม่ใช่สวิตช์ที่เหมาะสม "นักเทียบท่าเริ่มต้นง่ายๆ {ชื่อคอนเทนเนอร์}" ก็เพียงพอแล้ว
Ken Ingram

11

นี่คือวิธีที่ฉันจะแก้ไขใน Ubuntu 18:

  1. $ sudo docker ps -a
  2. คัดลอก ID คอนเทนเนอร์

สำหรับแต่ละภาชนะทำ:

  1. $ sudo docker stop container_ID
  2. $ sudo docker rm container_ID

10

คุณสามารถลบมันด้วยคำสั่งsudo docker rm YOUR_CONTAINER_IDจากนั้นเรียกใช้คอนเทนเนอร์ใหม่ด้วยsudo docker run ...; หรือรีสตาร์ทคอนเทนเนอร์ที่มีอยู่ด้วยsudo docker start YOUR_CONTAINER_ID


7

ฉันแก้ไขปัญหาโดยทำตามขั้นตอนต่อไปนี้และหวังว่าจะช่วยได้

  1. พิมพ์docker ps -aเพื่อแสดงรายการคอนเทนเนอร์ทั้งหมดในระบบของคุณ
  2. ตรวจสอบส่วนชื่อที่คุณได้เริ่มต้นภาชนะนักเทียบท่าของคุณ
  3. จากนั้นพิมพ์ docker rm --force name_of_container
  4. ติดตั้งคอนเทนเนอร์นักเทียบท่าตามที่คุณต้องการ

ฉันมีปัญหาในการใช้ NIFI และฉันได้ลบและติดตั้งใหม่โดยใช้ docker โชคดี.


4

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

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

เมื่อฉันวิ่ง docker ps -aนั่นคือตอนที่ฉันเห็นกล่องทดสอบหุ่นจำลองที่ฉันสร้างขึ้นในขณะที่ฉันกำลังเล่น

ไม่มีปัญหาเนื่องจากฉันไม่ต้องการสิ่งเหล่านั้นอีกต่อไปฉันเพิ่งทำdocker rm containernameไปจนถึงจุดที่คอนเทนเนอร์ใหม่ของฉันได้รับอนุญาตให้ทำงานด้วยชื่อเก่า

อาและตอนนี้ที่ฉันเขียนคำตอบนี้เสร็จแล้วฉันเห็นความคิดเห็นของ Slawosz เกี่ยวกับคำตอบของ Walt Howard ด้านบนแนะนำการใช้ docker ps -a

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