ข้ามไปยังเนื้อหาหลัก

Docker Build and Push (สร้างและ Push อิมเมจด้วย Kaniko)

สร้างและ push container image จาก Dockerfile ด้วย Kaniko แบบไม่ต้องพึ่งพา Docker daemon

การอ้างอิง (Reference): loha/docker-build@v1

หมวดหมู่: Build (การสร้างอิมเมจและแคช)

รันไทม์ (Runtime): gcr.io/kaniko-project/executor:v1.23.2-debug (รันแบบ root, ตรึงด้วย digest)

สัญญาอนุญาต (License): Apache-2.0

ควรใช้เมื่อ​

เหมาะสำหรับการ build ที่ต้องการพฤติกรรมของ Docker layer หรือคำสั่งเฉพาะทางที่ Buildah rootless ยังไม่รองรับ หากไม่มีความจำเป็นเฉพาะเจาะจง แนะนำให้เลือกใช้ buildah-build เป็นตัวเลือกหลักเพื่อความปลอดภัยในแบบ non-root

พารามิเตอร์​

พารามิเตอร์ชนิดค่าเริ่มต้นจำเป็นคำอธิบาย
IMAGEstring—ใช่ชื่อและ tag ของอิมเมจปลายทางในรูปแบบ registry/repository:tag
DOCKERFILEstring./Dockerfileไม่เส้นทาง (path) ของไฟล์ Dockerfile โดยคิดเทียบกับ build context
CONTEXTstring.ไม่ไดเรกทอรีที่ใช้เป็น build context สำหรับการ build
BUILD_ARGSstring""ไม่Build arguments สำหรับ Docker ในรูปแบบ KEY=VALUE (คั่นด้วยจุลภาค)
TARGETstring""ไม่เป้าหมาย stage ของ multi-stage build ที่ต้องการสร้าง; เว้นว่างไว้เพื่อ build จนถึง stage สุดท้าย
CACHEenum: true, falsetrueไม่เปิดใช้งานระบบ layer cache ของ Kaniko เพื่อเร่งความเร็วในการ build
SKIP_PUSHenum: true, falsefalseไม่สร้าง container image อย่างเดียวโดยไม่ push ไปยัง registry

พื้นที่ทำงาน (Workspaces)​

  • source (จำเป็น): เชื่อมโยงจาก pipeline workspace source
  • dockerconfig (ไม่บังคับ): เชื่อมโยงจาก pipeline workspace docker-credentials

ผลลัพธ์ (Results)​

ผลลัพธ์ (Result)คำอธิบาย
IMAGE_DIGESTค่า digest (SHA256) ของอิมเมจที่สร้างเสร็จ
IMAGE_URLURL อ้างอิงแบบเต็มของอิมเมจที่ push ไปยัง registry

การทำงาน​

สั่งรัน Kaniko Executor ร่วมกับไฟล์ Dockerfile และ build context ที่กำหนด โดย Kaniko ทำงานได้โดยไม่ต้องมี Docker daemon แต่จะรันในฐานะ root ภายในคอนเทนเนอร์ของ step เพื่อจัดการ image layer ทั้งนี้สิทธิ์ดังกล่าวถูกจำกัดอยู่เฉพาะภายในคอนเทนเนอร์เท่านั้นและไม่ส่งผลกระทบต่อโฮสต์ ระบบจะเปิดใช้งาน layer cache เป็นค่าเริ่มต้น และ mount dockerconfig workspace ให้อัตโนมัติเมื่อมีการตั้งค่า registry credential

ตัวอย่าง​

สร้างและ push อิมเมจตามปกติ​

steps:
- name: build-image
uses: loha/docker-build@v1
with:
IMAGE: 'registry.example.com/my-org/my-app:${COMMIT_SHA}'
CONTEXT: '.'
DOCKERFILE: './apps/dashboard/Dockerfile'
BUILD_ARGS: 'NODE_ENV=production,NEXT_TELEMETRY_DISABLED=1'

การทำ multi-stage build ไปยัง stage สำหรับ production​

steps:
- name: build-image
uses: loha/docker-build@v1
with:
IMAGE: 'registry.example.com/my-org/api:latest'
CONTEXT: '.'
TARGET: 'production'

สร้างอิมเมจและสแกนความปลอดภัยก่อน push​

ตัวอย่างนี้แสดงการเรียงลำดับขั้นตอน: build, scan หาช่องโหว่ และสร้างอิมเมจสำหรับขั้นตอนถัดไป โปรดตรวจสอบว่า pipeline ของคุณรองรับการสแกนก่อน push

steps:
- name: build-image
uses: loha/docker-build@v1
with:
IMAGE: 'registry.example.com/my-org/app:${COMMIT_SHA}'
SKIP_PUSH: 'true'

- name: scan-image
uses: loha/trivy-scan@v1
with:
SCAN_TYPE: 'image'
SCAN_TARGET: 'registry.example.com/my-org/app:${COMMIT_SHA}'

- name: push-image
uses: loha/docker-build@v1
with:
IMAGE: 'registry.example.com/my-org/app:${COMMIT_SHA}'
CACHE: 'false'

การแก้ปัญหา​

ปัญหา: พบข้อผิดพลาด COPY failed: no source files were specified

วิธีแก้: ตรวจสอบว่าไดเรกทอรี CONTEXT มีไฟล์ที่ระบุในคำสั่ง COPY ครบถ้วน โดย path ทั้งหมดจะต้องนับเทียบจาก root ของ workspace ไม่ใช่เทียบจากที่ตั้งของ Dockerfile


ปัญหา: ขั้นตอน build ทำงานช้ามากหรือเกิด timeout

วิธีแก้: คงค่า CACHE: "true" ไว้เสมอ, ปรับแต่งไฟล์ Dockerfile โดยย้ายบรรทัดคำสั่งที่มีการเปลี่ยนแปลงบ่อยไปไว้ท้ายสุด และสร้างไฟล์ .dockerignore เพื่อคัดกรองไฟล์ที่ไม่จำเป็นออกจาก build context

หมายเหตุ​

Kaniko จำเป็นต้องรันเป็น root ภายใน step container เพื่อสร้าง layer หากนโยบายความปลอดภัยขององค์กรไม่อนุญาตให้ใช้ root container กรุณาเปลี่ยนไปใช้ buildah-build แทน