วิธีตั้งชื่อ Dockerfiles


156

ฉันไม่แน่ใจว่าจะตั้งชื่อ Dockerfiles อย่างไร หลายคนบน GitHub ใช้Dockerfileโดยไม่มีนามสกุลไฟล์ ฉันให้ชื่อและนามสกุลแก่พวกเขาหรือไม่ ถ้ายังไง? หรือฉันเรียกมันว่าDockerfile?

คำตอบ:


182

อย่าเปลี่ยนชื่อของ dockerfile ถ้าคุณต้องการใช้ autobuilder ที่ hub.docker.com อย่าใช้นามสกุลสำหรับไฟล์นักเทียบท่าปล่อยให้เป็นโมฆะ ชื่อไฟล์ควรเป็น: (ไม่มีนามสกุลเลย)

Dockerfile

94
แล้วเมื่อคุณมี Dockerfiles หลายไฟล์ในไดเร็กทอรีเดียวกันล่ะ?
Visgean Skeloru

@VisgeanSkeloru แม้ว่าจะค่อนข้างยุ่งยาก แต่คุณสามารถวางไว้ในไดเรกทอรีที่แตกต่างกันได้หากจำเป็นไม่ว่าฉันจะมองไปที่ใดก็ตามดูเหมือนว่าจะมีการจัดตั้งขึ้นแล้ว
orustammanapov

2
@VisgeanSkeloru ไม่มี Dockerfiles หลายไฟล์ในไดเรกทอรีเดียวกัน ไดเร็กทอรีที่มีจะกลายเป็นบริบทสำหรับdocker buildคำสั่งซึ่งหมายความว่าแต่ละภาพจะถูกสร้างขึ้นใหม่โดยไม่จำเป็นหากมีการเปลี่ยนแปลง Dockerfile ของรูปภาพอื่น
Thomas

9
@Thomas บางครั้งคุณต้องวาง Dockerfiles หลายไฟล์ในไดเร็กทอรีเดียวกันเพื่อแชร์ไฟล์ทั่วไปข้ามคอนเทนเนอร์ที่แยกจากกันเนื่องจากบริบทของนักเทียบท่าไม่อนุญาตให้เข้าถึง "../some-common-stuff"
Devis L.

3
"D" ต้องเป็นตัวพิมพ์ใหญ่หรือไม่ไม่สำคัญ?
NoName

60

dev.Dockerfile, test.Dockerfile, build.Dockerfileฯลฯ

ฉันใช้ VS Code <purpose>.Dockerfileและได้รับการยอมรับอย่างถูกต้อง


ได้รับการยอมรับอย่างถูกต้องใน IntelliJ Idea Community 2020.2 เช่นกัน!
rahulmohan

29

ฉันคิดว่าคุณควรมีไดเร็กทอรีต่อคอนเทนเนอร์ที่มี Dockerfile (ไม่มีนามสกุล) อยู่ในนั้น ตัวอย่างเช่น:

  /db/Dockerfile
  /web/Dockerfile
  /api/Dockerfile

เมื่อคุณสร้างเพียงใช้ชื่อไดเร็กทอรี Docker จะพบ Dockerfile เช่น:

docker build -f ./db .

จะสร้างคอนเทนเนอร์ 3 ตู้จากตัวอย่างของคุณหรือไม่?
alvas

@alvas ใช่มันจะ
garryp

4
มันไม่ดีพอหลาย ๆ กรณี Docker ไม่สามารถมองเห็นไฟล์ได้ ตัวอย่างเช่นเป้าหมาย
บิล

เราสามารถรันไฟล์นักเทียบท่า 3 ตัวนี้พร้อมกันโดยใช้คำสั่ง docker-compose ได้ไหม
Yogi Ghorecha

แต่นี่คือเหตุผลว่าทำไมนักเทียบท่าจึงใช้แทน IMO ได้ดี ถ้าอย่างนั้นมันยืดหยุ่นมากว่าคุณต้องการจัดโครงสร้างหรือค้นหาไฟล์นักเทียบท่าจริงของคุณอย่างไร
PositiveGuy

16

หากคุณต้องการที่จะใช้ autobuilder ที่ hub.docker.com ก็จะต้องมีการ Dockerfileที่นั่น :)


4
ฉันเชื่อว่าบริบทของคำถามนั้นกว้างกว่า บางทีคุณอาจรวมถึงข้อมูลเพิ่มเติมสำหรับบุคคลที่ไม่ได้ใช้autobuilderเพื่อให้คำตอบนี้สมบูรณ์มากขึ้น
Josh Habdas

16

ดูเหมือนว่าจะเป็นเรื่องจริง แต่โดยส่วนตัวแล้วดูเหมือนว่าฉันจะออกแบบไม่ดี แน่นอนว่ามีชื่อเริ่มต้น (พร้อมนามสกุล) แต่อนุญาตชื่ออื่นและมีวิธีระบุชื่อไฟล์นักเทียบท่าสำหรับคำสั่ง

การมีส่วนขยายเป็นสิ่งที่ดีเพราะช่วยให้สามารถเชื่อมโยงแอปพลิเคชันกับประเภทส่วนขยายนั้นได้ เมื่อฉันคลิกที่ Dockerfile ใน MacOSX จะถือว่าไฟล์นั้นเป็นไฟล์ปฏิบัติการ Unix และพยายามเรียกใช้

หากไฟล์ Docker มีส่วนขยายฉันสามารถบอกให้ OS เริ่มต้นด้วยแอปพลิเคชันเฉพาะเช่นแอปพลิเคชันแก้ไขข้อความของฉัน ฉันไม่แน่ใจ แต่พฤติกรรมปัจจุบันอาจเกี่ยวข้องกับการอนุญาตของไฟล์ด้วย


16

ฉันได้สร้าง Dockerfiles สองไฟล์ในไดเรกทอรีเดียวกัน

# vi one.Dockerfile
# vi two.Dockerfile

เพื่อสร้างทั้ง Dockerfiles ใช้

# docker build . -f one.Dockerfile
# docker build . -f two.Dockerfile

หมายเหตุ: คุณควรอยู่ในไดเรกทอรีการทำงานปัจจุบัน ..


12

ฉันให้ชื่อและนามสกุลแก่พวกเขาหรือไม่ ถ้ายังไง

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

คุณอาจต้องการเปลี่ยนชื่อไฟล์ทั้งนี้ขึ้นอยู่กับความต้องการเฉพาะของคุณ ตัวอย่างเช่นหากคุณกำลังสร้างสถาปัตยกรรมหลายแบบคุณอาจต้องการเพิ่มส่วนขยายที่ระบุสถาปัตยกรรมตามที่ทีมresin.ioได้ทำไว้สำหรับคอนเทนเนอร์ HAProxy ตัวอย่าง ARM แบบหลายคอนเทนเนอร์ :

Dockerfile.aarch64
Dockerfile.amd64
Dockerfile.armhf
Dockerfile.armv7hf
Dockerfile.i386
Dockerfile.i386-nlp
Dockerfile.rpi

ในตัวอย่างที่ให้มา Dockerfile แต่ละตัวสร้างจากอิมเมจอัพสตรีมเฉพาะสถาปัตยกรรมที่แตกต่างกัน Dockerfile เฉพาะที่จะใช้สำหรับบิลด์อาจถูกระบุโดยใช้--file, -fตัวเลือกเมื่อสร้างคอนเทนเนอร์ของคุณโดยใช้บรรทัดคำสั่ง


1
ฉันชอบใช้ส่วนขยายเพื่อบ่งบอกสถาปัตยกรรม (หรืออะไรก็ตาม) ไม่เหมือนคำตอบอื่น ๆ Dockerfiles ทั้งหมดนั้นหาได้ง่ายในไดเร็กทอรีขนาดใหญ่ที่รก พวกมันเรียงตัวกันตามธรรมชาติ
Mike Sherrill 'Cat Recall'

นี่เป็นมาตรฐานที่ดีมากในการปฏิบัติตามขอบคุณ ~
Jake

6

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

$ docker build -f dockerfiles/Dockerfile.debug -t myapp_debug .
$ docker build -f dockerfiles/Dockerfile.prod  -t myapp_prod .

คำสั่งข้างต้นจะสร้างบริบทการสร้างปัจจุบัน (ตามที่ระบุไว้.) สองครั้งโดยใช้เวอร์ชันดีบักของ a Dockerfileและหนึ่งครั้งโดยใช้เวอร์ชันที่ใช้งานจริง

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

Dockerfile.<purpose>

Dockerfiles เหล่านี้อาจอยู่ในรูทของบริบทบิลด์ของคุณหรือในไดเร็กทอรีย่อยเพื่อให้ไดเร็กทอรีรูทของคุณเป็นระเบียบมากขึ้น


3

Dockerfileเป็นสิ่งที่ดีถ้าคุณมีไฟล์นักเทียบท่าเพียงไฟล์เดียว (ต่อไดเรกทอรี) คุณสามารถใช้มาตรฐานใดก็ได้ที่คุณต้องการหากคุณต้องการไฟล์นักเทียบท่าหลายไฟล์ในไดเร็กทอรีเดียวกัน - หากคุณมีเหตุผลที่ดี ในโครงการล่าสุดมีไฟล์ AWS docker และไฟล์สภาพแวดล้อม dev ในเครื่องเนื่องจากสภาพแวดล้อมแตกต่างกันมากพอ:

Dockerfile Dockerfile.aws


ฉันเคยเห็นวิธีนี้ใช้สำหรับระบุสถาปัตยกรรมเช่นกัน ตัวอย่างเช่นการวางDockerfile.armv7hfถัดจากไฟล์Dockerfile.i386.
Josh Habdas

2

Dockerfile (ชื่อและโฟลเดอร์ที่กำหนดเอง):

   docker/app.Dockerfile
   docker/nginx.Dockerfile

สร้าง:

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