ฉันจะเรียกใช้อินสแตนซ์นักเทียบท่าจาก DockerFile ได้อย่างไร


101

ในที่สุดฉันก็คิดหาวิธีทำให้นักเทียบท่าทำงานได้

docker run --name my-forum-nodebb --link my-forum-redis:redis -p 80:80 -p 443:443 -p 4567:4567 -P -t -i nodebb/docker:ubuntu

ฉันเชื่อมโยงกับอินสแตนซ์ redis เจ๋งมาก

ตั้งแต่เริ่มต้นและฉันคิดว่าเมื่อฉันสร้างอินสแตนซ์ redis

docker run --name my-forum-redis -d -p 6379:6379 nodebb/docker:ubuntu-redis

มันดึงภาพจาก repo ระยะไกล?

NodeBB เสนอDockerfile https://github.com/NodeBB/NodeBB/blob/master/Dockerfileฉันไม่ค่อยแน่ใจว่าจะใช้มันอย่างไร ฉันสมมติว่าฉันสามารถสร้างสภาพแวดล้อมภายในเครื่องได้โดยเรียก Dockerfile นี้บนรีโมทของฉัน

ถูกต้องหรือไม่ ถ้าเป็นเช่นนั้นฉันจะสร้างอินสแตนซ์ภายในที่ชี้ไปที่รีโมทได้อย่างไร


คุณสามารถสร้างอิมเมจนักเทียบท่าในสภาพแวดล้อมในพื้นที่ของคุณและดึงออกมาในพื้นที่
BMW

$ cat Dockerfile | docker build -t <image_name> - # mind the hyphen
jbobbylopez

คำตอบ:


104

ดาวน์โหลดไฟล์และจากไดเร็กทอรีเดียวกัน docker build -t nodebb .

สิ่งนี้จะให้ภาพบนเครื่องโลคอลของคุณที่ชื่อ nodebb ซึ่งคุณสามารถเรียกใช้คอนเทนเนอร์ได้ด้วยdocker run -d nodebb(คุณสามารถเปลี่ยนnodebbเป็นชื่อของคุณเองได้)


1
วิธีนี้ทำงานอย่างไร? ถ้าฉันแค่มี dockerfile มันจะรู้เกี่ยวกับโครงการของฉันได้อย่างไร? มีลิงค์ใน dockerfile หรือไม่? จากนั้นฉันคิดว่าถ้ามีนักเทียบท่าจัดการบรรจุอิมเมจใหม่ที่ฉันสามารถย้ายไปยังเซิร์ฟเวอร์ของฉันได้ ในบรรจุภัณฑ์นี้ดูดซับทรัพย์สินทั้งหมดในโครงการของฉันหรือไม่ ขออภัยหากฉันฟังดูงมงายนักเทียบท่าเป็นแนวคิดใหม่สำหรับฉัน แต่ฉันสนุกกับการเรียนรู้
Michael Joseph Aubry

2
ขอบคุณมากและ <> แสดงถึงอะไรในตัวอย่างของคุณทำไมคุณถึงเลือก <nodebb?
Michael Joseph Aubry

ไม่มีคอนเทนเนอร์นักเทียบท่าที่รู้เกี่ยวกับโครงการ "ของคุณ" เป็นเรื่องธรรมดามาก
Andreas Wederbrand

3
คำสั่งที่คุณระบุใช้งานไม่ได้ดังนั้นฉันจึงลองใช้ `นักเทียบท่าบิลด์ 'และมันใช้งานได้ แต่เนื่องจากไม่มีชื่อฉันจึงไม่สามารถรันได้ ให้ฉันdocker build -t <nodebb> . file exists: .ฉันมีโปรเจ็กต์ที่มีอยู่แล้วซึ่งมาพร้อมกับDockerfileดังนั้นฉันจึงรันมันภายในไดเร็กทอรี
Michael Joseph Aubry

2
นี่กำลังตอบคำถามของฉันมากมายแม้ว่าdocs.docker.com/engine/reference/builder
Michael Joseph Aubry

48

คุณไม่สามารถเริ่มคอนเทนเนอร์จาก Dockerfile

กระบวนการจะเป็นดังนี้:

Dockerfile = [ docker build] => Docker image = [ docker run] => Docker container

ในการเริ่ม (หรือเรียกใช้) คอนเทนเนอร์คุณต้องมีรูปภาพ ในการสร้างอิมเมจคุณต้องสร้าง Dockerfile [1]

[1]: คุณยังสามารถdocker importภาพจาก tarball docker loadหนึ่งหรืออีกครั้ง


29

แม้ว่าคำตอบข้างต้นจะใช้งานได้ แต่สิ่งนี้ช่วยฉันได้มากดังนั้นฉันจึงวางไว้ที่นี่ด้วย

จากเอกสารประกอบ :

แทนที่จะระบุบริบทคุณสามารถส่ง Dockerfile เดียวใน URL หรือไพพ์ไฟล์ผ่าน STDIN ในการไปป์ Dockerfile จาก STDIN:

$ docker build - < Dockerfile

ด้วย Powershell บน Windows คุณสามารถเรียกใช้:

Get-Content Dockerfile | docker build -

เมื่อสร้างเสร็จให้รันคำสั่ง:

docker image ls

คุณจะเห็นสิ่งนี้:

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
<none>                     <none>              123456789        39 seconds ago      422MB

คัดลอกรหัสภาพที่แท้จริงของคุณแล้วเรียกใช้

docker run 123456789

โดยที่ตัวเลขท้ายคือรหัสรูปภาพจริงจากขั้นตอนก่อนหน้า

หากคุณไม่ต้องการจำรหัสรูปภาพคุณสามารถแท็กรูปภาพของคุณโดย

docker tag 123456789 pavel/pavel-build

ซึ่งจะแท็กรูปภาพของคุณเป็น pavel/pavel-build


น่าทึ่งที่ในปี 2020 ตัวอย่างข้อมูลแรกใช้เวลาค้นหานานมาก
fullStackChris

นี่เป็นเพียงคำตอบที่ได้รับการยอมรับโดยมีพิธีรีตองมากขึ้น
Michail

21

วิธีแก้ปัญหาที่ง่ายและตรงไปตรงมาคือ:

docker build .
=> ....
=> Successfully built a3e628814c67
docker run -p 3000:3000 a3e628814c67

3000 - สามารถเป็นพอร์ตใดก็ได้

a3e628814c68 - ผลลัพธ์แฮชที่ได้รับจากคำสั่งสร้างความสำเร็จ

หมายเหตุ : คุณควรจะอยู่ในไดเรกทอรีที่มีDockerfile

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