มาสายดีกว่าไม่มาเลย. หรือว่าเราเกือบจะทำผิดพลาดร้ายแรงโดยไม่รองรับ Dockerfiles ปกติในการสร้างอิมเมจแอปพลิเคชัน
เราจะพูดถึง
- รวบรวมและเผยแพร่ภาพ
- ปรับใช้แอปพลิเคชันใน Kubernetes
- ลบภาพที่ไม่ได้ใช้โดยใช้นโยบายพิเศษ
ปรัชญาของโครงการนี้คือการรวบรวมเครื่องมือระดับต่ำมาไว้ในระบบรวมศูนย์เดียวที่ช่วยให้วิศวกร DevOps ควบคุมแอปพลิเคชันต่างๆ ได้ หากเป็นไปได้ ควรใช้ยูทิลิตี้ที่มีอยู่ (เช่น Helm และ Docker) หากไม่มีวิธีแก้ไขปัญหา เราสามารถสร้างและสนับสนุนทุกสิ่งที่จำเป็นสำหรับสิ่งนี้
พื้นหลัง: นักสะสมภาพของคุณเอง
นี่คือสิ่งที่เกิดขึ้นกับตัวรวบรวมรูปภาพใน werf: Dockerfile ปกติไม่เพียงพอสำหรับเรา หากคุณดูประวัติของโครงการอย่างรวดเร็ว ปัญหานี้ปรากฏใน werf เวอร์ชันแรกแล้ว (จากนั้นยังคง
ในขณะที่สร้างเครื่องมือสำหรับสร้างแอปพลิเคชันลงในอิมเมจ Docker เราก็รู้ได้อย่างรวดเร็วว่า Dockerfile ไม่เหมาะสำหรับเราสำหรับงานเฉพาะบางอย่าง:
- ความจำเป็นในการสร้างเว็บแอปพลิเคชันขนาดเล็กทั่วไปตามรูปแบบมาตรฐานต่อไปนี้:
- ติดตั้งการพึ่งพาแอปพลิเคชันทั้งระบบ
- ติดตั้งชุดไลบรารีการพึ่งพาแอปพลิเคชัน
- รวบรวมทรัพย์สิน
- และที่สำคัญคืออัพเดทโค้ดในภาพอย่างรวดเร็วและมีประสิทธิภาพ
- เมื่อมีการเปลี่ยนแปลงไฟล์โปรเจ็กต์ ตัวสร้างจะต้องสร้างเลเยอร์ใหม่อย่างรวดเร็วโดยใช้แพตช์กับไฟล์ที่เปลี่ยนแปลง
- หากไฟล์บางไฟล์มีการเปลี่ยนแปลง จำเป็นต้องสร้างสเตจที่ต้องพึ่งพาที่เกี่ยวข้องใหม่
ปัจจุบันนักสะสมของเรามีความเป็นไปได้อื่นๆ มากมาย แต่สิ่งเหล่านี้คือความปรารถนาและแรงกระตุ้นในช่วงแรกๆ
โดยทั่วไปแล้ว โดยไม่ต้องคิดซ้ำซาก เราก็เตรียมภาษาการเขียนโปรแกรมที่เราใช้ไว้ (ดูด้านล่าง) และเข้าสู่แนวทางการปฏิบัติ ดีเอสแอลของตัวเอง! ตามวัตถุประสงค์ มีวัตถุประสงค์เพื่ออธิบายกระบวนการประกอบเป็นขั้นตอนและพิจารณาการพึ่งพาของขั้นตอนเหล่านี้ในไฟล์ และเสริมด้วย นักสะสมของตัวเองซึ่งเปลี่ยน DSL ให้เป็นเป้าหมายสุดท้าย - ภาพที่ประกอบขึ้น ตอนแรก DSL อยู่ใน Ruby แต่เป็น
การกำหนดค่าเก่าสำหรับ dapp ใน Ruby
การกำหนดค่าปัจจุบันสำหรับ werf บน YAML
กลไกของตัวสะสมก็เปลี่ยนไปตามกาลเวลา ในตอนแรก เราเพียงแค่สร้าง Dockerfile ชั่วคราวได้ทันทีจากการกำหนดค่าของเรา จากนั้นเราก็เริ่มรันคำสั่งการประกอบในคอนเทนเนอร์ชั่วคราวและคอมมิต
NB: ในขณะนี้ Collector ของเราซึ่งทำงานร่วมกับการกำหนดค่าของตัวเอง (ใน YAML) และเรียกว่า Stapel Collector ได้พัฒนาเป็นเครื่องมือที่ทรงพลังพอสมควรแล้ว คำอธิบายโดยละเอียดสมควรได้รับบทความแยกต่างหาก และรายละเอียดพื้นฐานสามารถพบได้ใน
ความตระหนักรู้ถึงปัญหา
แต่เราตระหนักและไม่ใช่ในทันทีว่าเราทำผิดพลาดครั้งหนึ่ง: เราไม่ได้เพิ่มความสามารถเข้าไป สร้างภาพผ่าน Dockerfile มาตรฐาน และรวมเข้ากับโครงสร้างพื้นฐานการจัดการแอปพลิเคชันแบบ end-to-end เดียวกัน (เช่น รวบรวมอิมเมจ ปรับใช้ และล้างข้อมูล) เป็นไปได้อย่างไรที่จะสร้างเครื่องมือสำหรับการปรับใช้ใน Kubernetes และไม่ใช้การสนับสนุน Dockerfile เช่น วิธีมาตรฐานในการอธิบายภาพสำหรับโปรเจ็กต์ส่วนใหญ่ใช่ไหม..
แทนที่จะตอบคำถามนี้ เราเสนอวิธีแก้ปัญหา จะเป็นอย่างไรถ้าคุณมี Dockerfile อยู่แล้ว (หรือชุดของ Dockerfiles) และต้องการใช้ wef?
NB: ว่าแต่ ทำไมคุณถึงอยากใช้ werf ล่ะ? คุณสมบัติหลักมีดังต่อไปนี้:
- วงจรการจัดการแอปพลิเคชันเต็มรูปแบบ รวมถึงการทำความสะอาดรูปภาพ
- ความสามารถในการจัดการการประกอบภาพหลายภาพพร้อมกันจากการกำหนดค่าเดียว
- ปรับปรุงกระบวนการปรับใช้สำหรับแผนภูมิที่เข้ากันได้กับ Helm
สามารถดูรายการทั้งหมดเพิ่มเติมได้ที่
ดังนั้น หากก่อนหน้านี้เราเสนอให้เขียน Dockerfile ใหม่ในการกำหนดค่าของเรา ตอนนี้เราจะพูดว่า: “ให้ werf สร้าง Dockerfiles ของคุณ!”
วิธีการใช้งาน?
การใช้งานฟีเจอร์นี้โดยสมบูรณ์ปรากฏในรุ่น werf build
... เท่านี้ก็เรียบร้อย - werf จะประกอบภาพ ลองดูตัวอย่างที่เป็นนามธรรม
มาประกาศกันต่อไปครับ Dockerfile
ในรูทโปรเจ็กต์:
FROM ubuntu:18.04
RUN echo Building ...
และเราจะประกาศ werf.yaml
ซึ่งใช้สิ่งนี้ Dockerfile
:
configVersion: 1
project: dockerfile-example
---
image: ~
dockerfile: ./Dockerfile
ทั้งหมด! ซ้าย วิ่ง werf build
:
นอกจากนี้ คุณสามารถประกาศสิ่งต่อไปนี้ได้ werf.yaml
เพื่อสร้างภาพหลายภาพจาก Dockerfiles ที่แตกต่างกันในคราวเดียว:
configVersion: 1
project: dockerfile-example
---
image: backend
dockerfile: ./dockerfiles/Dockerfile-backend
---
image: frontend
dockerfile: ./dockerfiles/Dockerfile-frontend
สุดท้ายนี้ ยังรองรับการส่งพารามิเตอร์บิลด์เพิ่มเติมด้วย เช่น --build-arg
и --add-host
- ผ่านการกำหนดค่า WRF คำอธิบายที่สมบูรณ์ของการกำหนดค่าอิมเมจ Dockerfile มีอยู่ที่
มันทำงานอย่างไร
ในระหว่างกระบวนการสร้าง แคชมาตรฐานของเลเยอร์ในเครื่องในฟังก์ชัน Docker อย่างไรก็ตาม สิ่งที่สำคัญก็คือเวิร์ฟนั้นด้วย รวมการกำหนดค่า Dockerfile เข้ากับโครงสร้างพื้นฐาน. สิ่งนี้หมายความว่า?
- แต่ละภาพที่สร้างจาก Dockerfile ประกอบด้วยหนึ่งขั้นตอนที่เรียกว่า
dockerfile
(คุณสามารถอ่านเพิ่มเติมเกี่ยวกับขั้นตอนที่อยู่ใน wef ได้ที่นี่ ). - สำหรับเวที
dockerfile
werf คำนวณลายเซ็นที่ขึ้นอยู่กับเนื้อหาของการกำหนดค่า Dockerfile เมื่อการกำหนดค่า Dockerfile เปลี่ยนแปลง ลายเซ็นของสเตจจะเปลี่ยนไปdockerfile
และเวิร์ฟจะเริ่มสร้างสเตจนี้ใหม่ด้วยการกำหนดค่า Dockerfile ใหม่ หากลายเซ็นไม่เปลี่ยนแปลง werf จะนำรูปภาพจากแคช (รายละเอียดเพิ่มเติมเกี่ยวกับการใช้ลายเซ็นใน WRF ได้อธิบายไว้ในรายงานนี้ ). - ต่อไปสามารถเผยแพร่ภาพที่รวบรวมได้โดยใช้คำสั่ง
werf publish
(หรือwerf build-and-publish
) และใช้เพื่อปรับใช้กับ Kubernetes อิมเมจที่เผยแพร่ไปยัง Docker Registry จะถูกล้างโดยใช้เครื่องมือล้างข้อมูล Werf มาตรฐาน เช่น รูปภาพเก่า (เก่ากว่า N วัน) รูปภาพที่เกี่ยวข้องกับสาขา Git ที่ไม่มีอยู่จริง และนโยบายอื่นๆ จะถูกล้างโดยอัตโนมัติ
รายละเอียดเพิ่มเติมเกี่ยวกับประเด็นต่างๆ ที่อธิบายไว้ที่นี่มีอยู่ในเอกสารประกอบ:
หมายเหตุและข้อควรระวัง
1. ADD ไม่รองรับ URL ภายนอก
ขณะนี้ยังไม่รองรับการใช้ URL ภายนอกในคำสั่ง ADD
. Werf จะไม่เริ่มต้นการสร้างใหม่เมื่อทรัพยากรที่ URL ที่ระบุมีการเปลี่ยนแปลง เราวางแผนที่จะเพิ่มคุณสมบัตินี้เร็ว ๆ นี้
2. คุณไม่สามารถเพิ่ม .git ให้กับรูปภาพได้
โดยทั่วไปแล้ว การเพิ่มไดเร็กทอรี .git
ในภาพ - การปฏิบัติที่ไม่ดีและนี่คือเหตุผล:
- ถ้า
.git
ค้างอยู่ในภาพสุดท้ายซึ่งผิดหลักการแอพ 12 ปัจจัย : เนื่องจากอิมเมจสุดท้ายจะต้องเชื่อมโยงกับการคอมมิตเดียว จึงไม่สามารถทำได้git checkout
กระทำโดยพลการ -
.git
เพิ่มขนาดของรูปภาพ (พื้นที่เก็บข้อมูลอาจมีขนาดใหญ่เนื่องจากไฟล์ขนาดใหญ่ถูกเพิ่มเข้าไปแล้วลบออก) ขนาดของแผนผังการทำงานที่เกี่ยวข้องกับการคอมมิตเฉพาะจะไม่ขึ้นอยู่กับประวัติการดำเนินการใน Git ในกรณีนี้จะมีการเพิ่มเติมและการลบออกในภายหลัง.git
จากภาพสุดท้ายจะไม่ทำงาน: รูปภาพจะยังคงได้รับเลเยอร์พิเศษ - นี่คือวิธีการทำงานของ Docker - นักเทียบท่าสามารถเริ่มต้นการสร้างใหม่ที่ไม่จำเป็นได้ แม้ว่าจะมีการสร้างการคอมมิตเดียวกัน แต่จากแผนผังการทำงานที่แตกต่างกัน ตัวอย่างเช่น GitLab จะสร้างไดเร็กทอรีโคลนแยกต่างหากใน
/home/gitlab-runner/builds/HASH/[0-N]/yourproject
เมื่อเปิดใช้งานการประกอบแบบขนาน การประกอบซ้ำเพิ่มเติมจะเกิดจากการที่ไดเร็กทอรี.git
จะแตกต่างกันในเวอร์ชันโคลนที่แตกต่างกันของพื้นที่เก็บข้อมูลเดียวกัน แม้ว่าจะมีการสร้างการคอมมิตเดียวกันก็ตาม
จุดสุดท้ายยังมีผลที่ตามมาเมื่อใช้ wef Werf ต้องการให้แคชที่สร้างขึ้นปรากฏเมื่อรันคำสั่งบางคำสั่ง (เช่น werf deploy
). เมื่อคำสั่งเหล่านี้ทำงาน werf จะคำนวณลายเซ็นขั้นตอนสำหรับรูปภาพที่ระบุ werf.yaml
และจะต้องอยู่ในแคชแอสเซมบลี - มิฉะนั้นคำสั่งจะไม่สามารถทำงานต่อไปได้ หากลายเซ็นบนเวทีขึ้นอยู่กับเนื้อหา .git
จากนั้นเราจะได้รับแคชที่ไม่เสถียรต่อการเปลี่ยนแปลงในไฟล์ที่ไม่เกี่ยวข้อง และ Werf จะไม่สามารถให้อภัยการกำกับดูแลดังกล่าวได้ (สำหรับรายละเอียดเพิ่มเติม โปรดดู
โดยทั่วไป เพิ่มเฉพาะไฟล์ที่จำเป็นบางไฟล์เท่านั้น ผ่านคำแนะนำ ADD
ไม่ว่าในกรณีใดจะเพิ่มประสิทธิภาพและความน่าเชื่อถือของการเขียน Dockerfile
และยังปรับปรุงความเสถียรของแคชที่รวบรวมไว้สำหรับสิ่งนี้ด้วย Dockerfile
เพื่อการเปลี่ยนแปลงที่ไม่เกี่ยวข้องใน Git
ทั้งหมด
เส้นทางเริ่มต้นของเราในการเขียนตัวสร้างของเราเองสำหรับความต้องการเฉพาะนั้นยาก ซื่อสัตย์ และตรงไปตรงมา: แทนที่จะใช้ไม้ค้ำยันบน Dockerfile มาตรฐาน เราได้เขียนโซลูชันของเราด้วยไวยากรณ์แบบกำหนดเอง และสิ่งนี้ก็มีข้อดี: ตัวสะสม Stapel สามารถรับมือกับงานได้อย่างสมบูรณ์แบบ
อย่างไรก็ตาม ในกระบวนการเขียนตัวสร้างของเราเอง เรามองข้ามการสนับสนุน Dockerfiles ที่มีอยู่ไป ข้อบกพร่องนี้ได้รับการแก้ไขแล้ว และในอนาคตเราวางแผนที่จะพัฒนาการสนับสนุน Dockerfile พร้อมกับ Stapel builder แบบกำหนดเองของเราสำหรับการประกอบแบบกระจายและสำหรับการประกอบโดยใช้ Kubernetes (เช่น การประกอบบนรันเนอร์ภายใน Kubernetes เช่นเดียวกับที่ทำใน kaniko)
ดังนั้น หากคุณมี Dockerfiles อยู่สองสามไฟล์อยู่รอบๆ... ความพยายาม
ป.ล. รายการเอกสารในหัวข้อ
-
คำแนะนำสำหรับการเริ่มต้นอย่างรวดเร็ว ; -
การกำหนดค่าตัวสร้าง dockerfile ; -
สเตจอุปกรณ์ใน WRF ; -
ขั้นตอนการเผยแพร่ภาพ ; -
บูรณาการกับกระบวนการปรับใช้ Kubernetes ; -
กระบวนการทำความสะอาด ; -
Stapel builder เป็นทางเลือกแทน Dockerfile .
อ่านเพิ่มเติมในบล็อกของเรา: “
ที่มา: will.com