คุณจะจัดระเบียบ Dockerfiles ที่เป็นของโครงการได้อย่างไรเมื่อคุณมีหนึ่ง Dockerfile สำหรับฐานข้อมูลหนึ่งสำหรับแอปพลิเคชันเซิร์ฟเวอร์และอื่น ๆ คุณสร้างลำดับขั้นในแหล่งที่มาหรือไม่? โครงการองค์กรขนาดใหญ่ต้องไม่ประกอบด้วย Dockerfile เดียวเท่านั้น
คุณจะจัดระเบียบ Dockerfiles ที่เป็นของโครงการได้อย่างไรเมื่อคุณมีหนึ่ง Dockerfile สำหรับฐานข้อมูลหนึ่งสำหรับแอปพลิเคชันเซิร์ฟเวอร์และอื่น ๆ คุณสร้างลำดับขั้นในแหล่งที่มาหรือไม่? โครงการองค์กรขนาดใหญ่ต้องไม่ประกอบด้วย Dockerfile เดียวเท่านั้น
คำตอบ:
คำตอบนี้ล้าสมัย รูปไม่ได้อีกต่อไปแล้วและได้รับการแทนที่ด้วยหางเขียน คำตอบที่ยอมรับไม่สามารถลบได้ ....
Docker Compose รองรับการสร้างลำดับชั้นของโครงการ ดังนั้นจึงเป็นเรื่องง่ายที่จะสนับสนุน Dockerfile ในแต่ละไดเรกทอรีย่อย
├── docker-compose.yml
├── project1
│ └── Dockerfile
└── project2
└── Dockerfile
ฉันเพิ่งสร้างไดเรกทอรีที่มี Dockerfile สำหรับแต่ละองค์ประกอบ ตัวอย่าง:
เมื่อสร้างคอนเทนเนอร์ให้ตั้งชื่อไดเรกทอรีและ Docker จะเลือก Dockerfile ที่ถูกต้อง
ในDocker เวอร์ชันใหม่กว่า (> = 1.8.0)คุณสามารถทำได้
docker build -f Dockerfile.db .
docker build -f Dockerfile.web .
ประหยัดใหญ่
แก้ไข: อัปเดตเวอร์ชันตามความคิดเห็นของ raksja
แก้ไข: ความคิดเห็นจาก @vsevolod: เป็นไปได้ที่จะได้รับการเน้นไวยากรณ์ในรหัส VS โดยการให้ไฟล์นามสกุล. docerfile (แทนชื่อ) เช่น Prod.Dockerfile, Test.Dockerfile ฯลฯ
Dockerfile.web
มีการกำหนดค่าการทำงาน ดังนั้นฉันจึงสร้างปัญหา: youtrack.jetbrains.com/issue/WEB-28185
docker-compose.yml
ไฟล์ตัวอย่างเช่น
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
ในไดเรกทอรีเช่น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 นักเทียบท่า-เขียนเป็น ตรวจสอบให้แน่ใจว่าคุณอ้างถึงเอกสารทางการสำหรับรายละเอียดเพิ่มเติม
COPY ../package.json /app/package.json
) ไฟล์ดังกล่าวมักจะอยู่ที่ระดับรูทและนักเทียบท่าได้ห้ามการเข้าถึงพาเรนต์ คุณจะทำตามแนวทางอะไร
web
จากโครงการ.
(ในdocker-compose.yml
: build: .
) วิธีนี้web
มีการเข้าถึงไฟล์รูทเมื่อสร้าง ฉันเคยเห็นคำถามที่เกี่ยวข้องนี้: stackoverflow.com/questions/24537340/ …และเราสามารถสร้างจากไดเรกทอรีหลักแทนเมื่อใช้docker
บรรทัดคำสั่งและคำตอบนี้แสดงวิธีการทำเช่นนี้ด้วย docker-compose: stackoverflow.com/a/45353241/ 1092815
-f
ตัวเลือกใช้ได้ แต่ฉันชอบที่จะใช้docker-compose
กับโฟลเดอร์ย่อย ฉันคิดว่าคำตอบทั้งสองนั้นใช้ได้ คนส่วนใหญ่อาจต้องการเก็บDockerfile
ชื่อเริ่มต้นไว้เพื่อรองรับ IDE ส่วนใหญ่ไม่อยู่ในกล่อง ฉันไม่ได้ลบคำตอบแรกฉันแค่ให้ทางเลือก ฉันไม่ชอบ IDE ที่จะคิดว่า Dockerfile ของฉันเป็นphp
ไฟล์เมื่อฉันใช้Dockerfile.php
แต่ใช่มันใช้งานได้ ฉันเห็นตัวอย่างในเอกสารนักเทียบท่า; Dockerfile.build
, Dockerfile.debug
ฯลฯ
example.Dockerfile
เพื่อให้การเน้นไวยากรณ์และไอคอนบน VSCode
ใน Intellij ฉันเปลี่ยนชื่อไฟล์ docker เป็น * .Dockerfile อย่างง่ายและเชื่อมโยงประเภทไฟล์ * .Dockerfile เข้ากับไวยากรณ์นักเทียบท่า
เพิ่มเลเยอร์ที่เป็นนามธรรมเช่นไฟล์ 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 ทั้งหมดจากไฟล์กำหนดค่า
เมื่อทำงานกับโปรเจ็กต์ที่ต้องใช้หลาย dockerfiles เพียงสร้างแต่ละ dockerfile ในไดเรกทอรีแยกต่างหาก ตัวอย่างเช่น
แอพ / db /
แต่ละไดเรกทอรีด้านบนจะมี dockerfile เมื่อมีการสร้างแอปพลิเคชันนักเทียบท่าจะค้นหาไดเรกทอรีทั้งหมดและสร้างนักเทียบท่าทั้งหมด