Week 7 : Update Pipeline & Create Docker File - Po-Pon/SW-Development-Tool-And-Environments-Group1 GitHub Wiki


Best practices for writing Dockerfiles

  1. Create ephemeral containers (สร้าง containers ชั่วคราว)
    • Docker image ที่ถูกสร้างจากตัว Dockerfile นั้นควรจะสร้าง containers ชั่วคราวขึ้นมา ที่สามารถหยุดการทำงานและทำลายได้ จากนั้นทำการสร้างขึ้นใหม่และแทนที่ด้วยการตั้งค่าและกำหนดค่าขั้นต่ำที่แน่นอน
  2. Understand build context(ทำความเข้าใจตัว build context)
    • เมื่อใช้คำสั่ง build ตัว docker, ตัว directory ที่กำลังทำงานอยู่ในปัจจุบันจะถูกเรียกว่า build context. ตามค่าเริ่มต้นจะถือว่าตัว dockerfile จะอยู่ที่นี่ แต่เราสามารถที่จะระบุตำแหน่งที่ตั้งอื่นได้โดยใช้ file flag (-f). ซึ่งไม่ว่าตัว dockerfile จะอยู่ที่ตำแหน่งใด ทุก recursive content ของ files และdirectories ใน directoryปัจจุบัน จะถูกส่งไปยัง Docker deamon ในฐานะ build context
  3. Pipe Dockerfile through stdin
    • Docker มีคุณสมบัติในการสร้าง image ผ่านการทำ piping dockerfile ผ่าน stdin ด้วย local หรือ remote build context ทำให้สามารถ build ตัว docker ได้โดยไม่จำเป็นต้องทำการเขียนตัว dockerfile ลงบน disk
  4. Exclude with .dockerignore
    • เราควรที่จะใช้งาน .dockerignore เพื่อแยกไฟล์ที่ไม่จำเป็นในการสร้าง Docker image จาก Dockerfile ซึ่ง .dockerignore มีรูปแบบการเขียนที่คล้ายกับ .gitignore
  5. Use multi-stage builds
    • การทำ multi-stage builds จะช่วยเพิ่มความสะดวกในการสร้าง image โดยเราไม่จำเป็นต้องสร้าง Dockerfile หลายๆ file และสามารถช่วยลดขนาดของ final image เป็นอย่างมากโดยไม่ต้องพยายามที่จะลดจำนวน layer โดยการใช้ build cache ยกตัวอย่างเช่น หากการ build นั้นมีหลาย layer เราจะต้องเรียงลำดับ layer ที่มีการเปลี่ยนแปลงน้อยไปจนถึงการเปลี่ยนแปลงที่บ่อยกว่า เช่น
      • ติดตั้งเครื่องมือที่จำในการสร้าง app
      • ติดตั้ง หรือ อัปเดต library ,dependencies
      • สร้าง app
  6. Don’t install unnecessary packages
    • เพื่อลด ความซับซ้อน, dependencies, ขนาดไฟล์ และ เวลาในการ build ควรจะหลีกเลี่ยงการติดตั้งแพ็คเกจพิเศษหรือแพ็คเกจที่ไม่จำเป็น
  7. Decouple applications
    • ในแต่ละ Container ควรจะมีภาระการทำงานเพียงอย่างเดียว ก็คือการแยก application ออกเป็นหลายๆ Container ซึ่งจะทำให้ง่ายต่อการปรับขนาดและนำ Container กลับมาใช้ใหม่ได้ง่ายขึ้น
  8. Minimize the number of layers
    • ใน Docker version เก่า มันเป็นสิ่งที่สำคัญมากในการลดจำนวน layers ใน images เพื่อทำให้แน่ใจว่ามีประสิทธิภาพ โดย features ต่อไปนี้ถูกเพิ่มเข้ามาเพื่อลดข้อจำกัดดังนี้
      1. มีแค่เฉพาะคำสั่ง RUN, COPYและ ADDเท่านั้นที่สามารถสร้างlayers ส่วน instructions อื่นๆ จะสามารถสร้าง images ระดับกลางชั่วคราวและจะไม่เพิ่มขนาดของ build
      2. หากเป็นไปได้ ให้ใช้ multi-stage builds, และ copy เฉพาะตัว artifacts ทีจำเป็นใน final images ซึ่งจะช่วยให้สามารถรวมเครื่องมือ และข้อมูลการ debug ในระหว่างขั้นตอนการสร้างโดยไม่เพิ่มขนาดของ final image
  9. Sort multi-line arguments
    • ถ้าเป็นไปได้, ให้ทำการ change ภายหลังในครั้งต่อไปง่ายขึ้นด้วยการจัดเรียง arguments ตามตัวอักษร ซึ่งวิธีนี้จะช่วยหลีกเลี่ยงความซ้ำซ้อนของ packages และทำให้การอัปเดตนั้นง่ายขึ้นนอกจากนี้ยังทำให้ PRs อ่าน และReview ง่ายขึ้น, การเว้นวรรคก่อน backslash(/) ก็สามารถช่วยได้เช่นกัน
  10. Leverage build cache
    • เมื่อมีการสร้างตัว image, Docker จะทำการดำเนินการตาม instruction ในตัว dockerfile โดยดำเนินการตามลำดับที่ได้ระบุไว้, เมื่อได้ตรวจสอบแต่ละคำสั่งแล้ว Docker จะค้นหา image ที่มีอยู่ใน cache ซึ่งสามารถนำมาใช้ซ้ำได้ แทนที่จะสร้าง image ใหม่ ซึ่งถ้าต้องการจะใช้ cache, นั่นเป็นสิ่งที่สำคัญมากที่ต้องเข้าใจว่าเมื่อใด ที่มันสามารถทำได้ หรือไม่สามารถหา image ที่ matchingกันได้ โดยมีกฏพื้นฐานที่ Docker จะทำตามมีดังนี้
      1. เริ่มต้นด้วยตัว parent image ที่มีอยู่ใน cache อยู่แล้ว, ซึ่งขั้นตอนต่อไปจะถูกเอาไปเปรียบเทียบกับ chile image ทั้งหมด ที่ได้รับมาจาก base image เพื่อดูว่ามันได้ถูกสร้างขึ้นมาแล้วรึยังโดยใช้ขั้นตอนเดียวกัน ถ้าพบว่ายังไม่ถูกสร้างขึ้น, cache จะไม่สามารถใช้งานได้
      2. ในกรณีส่วนใหญ่, เพียงแค่เปรียบ instruction ใน Dockerfile กับหนึ่งใน chile image นั้นเพียงพอแล้ว แต่อย่างไรก็ตาม instruction บางตัวจำเป็นต้องมีการตรวจสอบ และคำอธิบายเพิ่มเติม
      3. สำหรับตัว instructions ADD และCOPY, เนื้อหาของ file(s) ใน image จะถูตรวจสอบ และมีการ checksum ที่ถูกคำนวณในแต่ละ file. โดย การแก้ไขครั้งล่าสุด และการเข้าถึงครั้งล่าสุดจะไม่ถูกนำมาพิจารณาใน checksumด้วย. ในระหว่างการค้นหา cache, checksum จะถูกเปรียบเทียบกับตัว checksum ใน existing images. หากมีสิ่งใดเปลี่ยนแปลงภายใน file(s) เช่น ตัว content และmetadata, cache ก็จะไม่สามารถใช้งานได้
      4. นอกเหนือจากคำสั่ง ADD และCOPY, การตรวจสอบ cache จะไม่พิจารณที่ files ใน container เพื่อค้นหา cacheที่ตรงกัน ตัวอย่างเช่น เมื่อประมวลผลคำสั่ง RUN apt-get -y update ไฟล์ที่อัปเดตใน container จะไม่ถูกตรวจสอบว่า cache นั้นมีอยู่รึเปล่า แต่ในกรณีนั้นมีเพียงคำสั่ง string itself ที่สามารถใช้ในการค้นหาการ match กัน
    • เมื่อ cache ใช้งานไม่ได้, คำสั่ง Dockerfile ที่ตามมาภายหลัง จะทำการ generate images ใหม่ และไม่ใช้ cache

หัวข้อ Best practices for writing Dockerfiles ที่นำมาใช้ใน project นี้

  1. Exclude with .dockerignore เพราะต้องมีการจำกัดไฟล์ที่นำมาใช้ในการสร้าง Docker Image จาก Dockerfile ให้มีเฉพาะไฟล์ที่จำเป็นเท่านั้น
  2. Don’t install unnecessary packages เพื่อให้ไฟล์มีขนาดที่ไม่ใหญ่จนเกินไป

Link Docker Hub

สรุปการสร้าง Dockerfile (frontend & backend)

  1. กำหนด Base Image ที่จะใช้ภายใน container (ในที่นี่จะเลือกใช้เป็น node:16.14 - alpine)
  2. กำหนด work Directory (ในที่นี้จะกำหนดเป็น /app)
  3. ทำการ copy file package.json และไฟล์ yarn.lock ไปไว้ใน work Directory ที่กำหนดไว้ก่อนหน้านี้
  4. ติดตั้ง dependencies ให้กับตัว Docker image
  5. ทำการ copy file งานทั้งหมดที่จำเป็นเข้าไปยังตัว Docker image
  6. ทำการ build ตัว project ของเราจาก Docker image

สรุปจำนวนครั้งในการ build แบบอัตโนมัติของทุกวันในสัปดาห์นี้

Frontend

Date

Build

Build success

Build failure

2022/03/28

0

0

0

2022/03/29

0

0

0

2022/03/30

0

0

0

2022/03/31

0

0

0

2022/04/01

0

0

0

2022/04/02

1

1

0

2022/04/03

11

8

3

Backend

Date

Build

Build success

Build failure

2022/03/28

0

0

0

2022/03/29

0

0

0

2022/03/30

0

0

0

2022/03/31

0

0

0

2022/04/01

0

0

0

2022/04/02

1

1

0

2022/04/03

7

4

3

Line change and Number commit of Group

wiki

Student No.

Name

Line Change (%)

No. of Commit (%)

62070112

นายปภัส  เงาธัมมะสกุล

16.66% 16%

62070113

นายประธาน นาเวียง

16.69% 6%

62070134

นายพลัฏฐ์  วงศ์สิทธิพรรุ่ง

16.66% 12%

62070139

นายพิชญะ  สิงห์มีศรี

16.69% 10%

62070168

นายวิชยุตม์  ทวิชัยยุทธ

16.63% 16%

62070215

นายอคิราภ์  สีแสนยง

16.66% 40%

Code

Student No.

Name

Line Change (%)

No. of Commit (%)

62070112

นายปภัส  เงาธัมมะสกุล

2.89%

12%

62070113

นายประธาน นาเวียง

4.46%

8%

62070134

นายพลัฏฐ์  วงศ์สิทธิพรรุ่ง

19.47%

12%

62070139

นายพิชญะ  สิงห์มีศรี

1.87%

8%

62070168

นายวิชยุตม์  ทวิชัยยุทธ

2.20%

13%

62070215

นายอคิราภ์  สีแสนยง

69.12%

47%

⚠️ **GitHub.com Fallback** ⚠️