นักเทียบท่า: หลายนักเทียบท่าในโครงการ


215

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


15
คุณอาจต้องการเปลี่ยนคำตอบที่ยอมรับ
pomber

3
ควรมีตัวเลือก "outvote" และย้ายแอตทริบิวต์ `Accepted 'ที่ล้าสมัยไปยังคำตอบที่เหมาะสมกว่าโดยอัตโนมัติ เกณฑ์คุณสมบัติสำหรับการย้ายดังกล่าวอาจเป็น 1) ความแตกต่างอย่างมากในการโหวต 10: 1 และ 2) ผู้เขียนคำถามไม่ได้เข้าสู่ระบบเพื่อพูดว่าหนึ่งปีหรือนานกว่านั้น (ดูเหมือน @LuckLuke ได้เกษียณจาก SO 4 ปี ที่ผ่านมา ... )
mirekphd

คำตอบ:


6

ผู้เขียนหมายเหตุ

คำตอบนี้ล้าสมัย รูปไม่ได้อีกต่อไปแล้วและได้รับการแทนที่ด้วยหางเขียน คำตอบที่ยอมรับไม่สามารถลบได้ ....

Docker Compose รองรับการสร้างลำดับชั้นของโครงการ ดังนั้นจึงเป็นเรื่องง่ายที่จะสนับสนุน Dockerfile ในแต่ละไดเรกทอรีย่อย

├── docker-compose.yml
├── project1
│   └── Dockerfile
└── project2
    └── Dockerfile

คำตอบเดิม

ฉันเพิ่งสร้างไดเรกทอรีที่มี Dockerfile สำหรับแต่ละองค์ประกอบ ตัวอย่าง:

เมื่อสร้างคอนเทนเนอร์ให้ตั้งชื่อไดเรกทอรีและ Docker จะเลือก Dockerfile ที่ถูกต้อง


3
@DuncanJones ทำให้คุณไม่สามารถลบคำตอบที่ยอมรับได้ ... พยายาม :-)
Mark O'Connor

286

ในDocker เวอร์ชันใหม่กว่า (> = 1.8.0)คุณสามารถทำได้

docker build -f Dockerfile.db .
docker build -f Dockerfile.web .

ประหยัดใหญ่

แก้ไข: อัปเดตเวอร์ชันตามความคิดเห็นของ raksja

แก้ไข: ความคิดเห็นจาก @vsevolod: เป็นไปได้ที่จะได้รับการเน้นไวยากรณ์ในรหัส VS โดยการให้ไฟล์นามสกุล. docerfile (แทนชื่อ) เช่น Prod.Dockerfile, Test.Dockerfile ฯลฯ


2
เวอร์ชันใหม่กว่านี้
raksja

4
เพิ่งตรวจสอบแล้วgithub.com/docker/docker/wikiดังนั้น> Docker 1.8.0
raksja

3
แน่ใจว่าใช้งานได้ แต่ IDE ของฉันจะไม่เน้นไวยากรณ์ใด ๆ เนื่องจากไม่รู้จักชื่อไฟล์ :(
Alexander Mills

3
@AlexanderMills IDE WebStorm ของฉันไม่อนุญาตให้Dockerfile.webมีการกำหนดค่าการทำงาน ดังนั้นฉันจึงสร้างปัญหา: youtrack.jetbrains.com/issue/WEB-28185
steampowered

5
คุณจะระบุว่าควรใช้ Dockerfile ใดสำหรับ 'บริการ' ที่กำหนดไว้ในแต่ละdocker-compose.ymlไฟล์ตัวอย่างเช่น
JoeTidee

127

ใช้docker-composeและหลายรายการDockerfileในไดเรกทอรีแยกกัน

อย่าเปลี่ยนชื่อDockerfileเป็นDockerfile.dbหรือDockerfile.webอาจไม่ได้รับการสนับสนุนจาก IDE ของคุณและคุณจะสูญเสียการเน้นไวยากรณ์

ดังที่Kingsley Uchnor กล่าวว่าคุณสามารถมีได้หลายรายการDockerfileต่อไดเรกทอรีซึ่งเป็นตัวแทนของสิ่งที่คุณต้องการสร้าง

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

docker-compose.yml
docker
├── web
│   └── Dockerfile
└── db
    └── Dockerfile

docker-compose.yml ตัวอย่าง:

version: '3'
services:
  web:
    # will build ./docker/web/Dockerfile
    build: ./docker/web
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  db:
    # will build ./docker/db/Dockerfile
    build: ./docker/db
    ports:
      - "3306:3306"
  redis:
    # will use docker hub's redis prebuilt image from here:
    # https://hub.docker.com/_/redis/
    image: "redis:alpine"

docker-compose ตัวอย่างการใช้บรรทัดคำสั่ง:

# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d

# get help
docker-compose --help

ในกรณีที่คุณต้องการไฟล์จากโฟลเดอร์ก่อนหน้าเมื่อสร้าง Dockerfile ของคุณ

คุณยังสามารถใช้โซลูชันข้างต้นและวางไว้Dockerfileในไดเรกทอรีเช่นdocker/web/Dockerfileทั้งหมดที่คุณต้องมีเพื่อตั้งค่าการสร้างcontextในdocker-compose.ymlแบบนี้

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
     - "5000:5000"
    volumes:
     - .:/code

ด้วยวิธีนี้คุณจะสามารถมีสิ่งต่าง ๆ ดังนี้:

config-on-root.ini
docker-compose.yml
docker
└── web
    ├── Dockerfile
    └── some-other-config.ini

และ./docker/web/Dockerfileเช่นนี้

FROM alpine:latest

COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /

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


1
ถ้าคุณต้องการคัดลอกไฟล์ตัวจัดการแพ็กเกจเพื่อติดตั้งขึ้นอยู่กับเวลาในการสร้าง (fi COPY ../package.json /app/package.json) ไฟล์ดังกล่าวมักจะอยู่ที่ระดับรูทและนักเทียบท่าได้ห้ามการเข้าถึงพาเรนต์ คุณจะทำตามแนวทางอะไร
nass600

1
ฉันตีว่าข้อ จำกัด เกินไปและข้อยกเว้นนี้ผมสร้างwebจากโครงการ. (ในdocker-compose.yml: build: .) วิธีนี้webมีการเข้าถึงไฟล์รูทเมื่อสร้าง ฉันเคยเห็นคำถามที่เกี่ยวข้องนี้: stackoverflow.com/questions/24537340/ …และเราสามารถสร้างจากไดเรกทอรีหลักแทนเมื่อใช้dockerบรรทัดคำสั่งและคำตอบนี้แสดงวิธีการทำเช่นนี้ด้วย docker-compose: stackoverflow.com/a/45353241/ 1092815
GabLeRoux

1
นี่เป็นปัญหากับ IDE ของคุณไม่ใช่กับตัวเชื่อมต่อ @Shuo มีคำตอบที่ถูกต้อง
BentOnCoding

1
คำตอบที่สองคือ 1 ปี แต่มันไม่ใช่เอกสารของ Docker โดยตรง -fตัวเลือกใช้ได้ แต่ฉันชอบที่จะใช้docker-composeกับโฟลเดอร์ย่อย ฉันคิดว่าคำตอบทั้งสองนั้นใช้ได้ คนส่วนใหญ่อาจต้องการเก็บDockerfileชื่อเริ่มต้นไว้เพื่อรองรับ IDE ส่วนใหญ่ไม่อยู่ในกล่อง ฉันไม่ได้ลบคำตอบแรกฉันแค่ให้ทางเลือก ฉันไม่ชอบ IDE ที่จะคิดว่า Dockerfile ของฉันเป็นphpไฟล์เมื่อฉันใช้Dockerfile.phpแต่ใช่มันใช้งานได้ ฉันเห็นตัวอย่างในเอกสารนักเทียบท่า; Dockerfile.build, Dockerfile.debugฯลฯ
GabLeRoux

3
การตั้งชื่อexample.Dockerfileเพื่อให้การเน้นไวยากรณ์และไอคอนบน VSCode
vmassuchetto

8

ใน Intellij ฉันเปลี่ยนชื่อไฟล์ docker เป็น * .Dockerfile อย่างง่ายและเชื่อมโยงประเภทไฟล์ * .Dockerfile เข้ากับไวยากรณ์นักเทียบท่า


1
ลองนี่แล้วฉันจะได้ไอคอนนักเทียบท่าที่ดี
Drumbeg

3

เพิ่มเลเยอร์ที่เป็นนามธรรมเช่นไฟล์ YAML เช่นในโครงการนี้https://github.com/larytet/dockerfile-generatorซึ่งดูเหมือน

centos7:
    base: centos:centos7
    packager: rpm
    install:
      - $build_essential_centos 
      - rpm-build
    run:
      - $get_release
    env:
      - $environment_vars

สคริปต์ / make Python แบบสั้นสามารถสร้าง Dockerfiles ทั้งหมดจากไฟล์กำหนดค่า


1

เมื่อทำงานกับโปรเจ็กต์ที่ต้องใช้หลาย dockerfiles เพียงสร้างแต่ละ dockerfile ในไดเรกทอรีแยกต่างหาก ตัวอย่างเช่น

แอพ / db /

แต่ละไดเรกทอรีด้านบนจะมี dockerfile เมื่อมีการสร้างแอปพลิเคชันนักเทียบท่าจะค้นหาไดเรกทอรีทั้งหมดและสร้างนักเทียบท่าทั้งหมด

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