← Back to list

มาใช้งาน Jenkins DinD ร่วมกับ Trivy กันเถอะ — Jenkins ep.4.1

สวัสดีครับ วันนี้จะมาแชร์วิธีใช้งาน Jenkins DinD ร่วมกับ Trivy นะครับ จะเป็นยังไงบ้าง มาเริ่มกันเลยครับ

Punthanat Ularnwiriyanont · 2025-04-29 13:48 · 400 claps · 3.8 min read
#jenkins-trivy #jenkins #trivy #jenkins-dind #jenkins-docker-trivy
Open on Medium ↗
Wiki topics: ☁️ · DevOps & Cloud

มาใช้งาน Jenkins DinD ร่วมกับ Trivy กันเถอะ — Jenkins ep.4.1

สวัสดีครับ วันนี้จะมาแชร์วิธีใช้งาน Jenkins DinD ร่วมกับ Trivy นะครับ จะเป็นยังไงบ้าง มาเริ่มกันเลยครับ

Tools ที่ใช้งานจะมีดังนี้

  1. Jenkins DinD
  2. GitLab
  3. Harbor

Goal ในตอนนี้คือการใช้ Jenkins ทำ CI สำหรับทำ CIS Scan (Container Image Security) โดยใช้ Trivy และมีการเก็บ Source Code ไว้บน GitLab ซึ่งจะใช้ Trivy ในการ Scan image ที่อยู่บน Harbor และบน Local นะครับ

วิธีติดตั้ง Jenkins DinD

[embed]มาใช้งาน Docker บน Jenkins แบบ DinD กันเถอะ — Jenkins ep.5 สวัสดีครับ วันนี้จะมาแชร์วิธีใช้งาน Docker บน Jenkins แบบ DinD นะครับ จะเป็นยังไงบ้าง มาเริ่มกันเลยครับmedium.com

Jenkins Configuration

1. ติดตั้ง Plugin ทำการติดตั้ง Docker และ Docker Pipeline Plugin และ Restart Jenkins ก่อนครับ เพื่อใช้งาน Jenkins ร่วมกับ Docker

plugins

plugins

2. ต่อมาทำการเพิ่ม Credentials บน Jenkins เพื่อที่จะเอาไปใช้บน Pipeline

  • HARBOR_URL ต้องสร้างเป็น Secret text (ไม่ต้องใส่ http:// และ https://))
  • HARBOR_CRED ต้องสร้างเป็น username with password ซึ่งมันคือ username password สำหรับ Login เข้า Harbor
  • HARBOR_USER ต้องสร้างเป็น Secret text ซึ่งมันคือ username สำหรับ Login เข้า Harbor
  • HARBOR_PASS ต้องสร้างเป็น Secret text ซึ่งมันคือ password สำหรับ Login เข้า Harbor

HARBOR_URL

HARBOR_URL

HARBOR_CRED

HARBOR_CRED

3. ทำการสร้าง Project บน Harbor กด + New Project ได้เลย ถ้าสร้างเสร็จแล้วจะได้แบบนี้

4. จัดการ Jenkinsfile แล้ว Push ไปที่ GitLab มีหลายวิธีในการใช้ Trivy สแกน Image แต่ในตอนนี้จะใช้ท่า docker run Trivy เนื่องจาก Jenkins เป็น Container ที่สร้างโดย Docker ซึ่งการใช้ Trivy จะต้องรัน Docker ข้างใน Jenkins Container อีกที จะเรียกว่า DinD (Docker in Docker) สามารถจัดการได้ 2 วิธี

  1. Jenkins Container ให้ Mount /var/run/docker.sock เข้าไป เพื่อให้ Jenkins เรียกใช้งาน Docker daemon ได้ แต่จะเป็นการเรียกใช้ Docker บนเครื่อง Host แทน และการใช้คำสั่ง--volume บน docker ที่อยู่ภายใต้ Jenkins Container มันจะใช้ Path บนเครื่อง Host แทน ไม่ใช่ Path บน Jenkins Container
  2. ใช้งาน Jenkins Container ร่วมกับ DinD

ในตอนนี้จะใช้วิธีที่ 2 Jenkins Container ร่วมกับ DinD นะครับ ถ้าเราใช้คำสั่ง docker exec เข้าไปใน Jenkins Container และใช้คำสั่ง docker ps เราต้องไม่เห็น Container ที่อยู่บน Host นะครับ

ตัวอย่าง Jenkinsfile

pipeline {
    agent any
    environment {
        HARBOR_URL = credentials('HARBOR_URL')
        HARBOR_CRED = "HARBOR_CRED"
        HARBOR_USER = credentials('HARBOR_USER')
        HARBOR_PASS = credentials('HARBOR_PASS')
        PROJECT = "banjo-only"
        APP_NAME = "nodejs-test"
    }
    stages {
        stage("Build Image") {
            steps {
                script {
                    env.commitId = env.GIT_COMMIT.substring(0, 10)
                    def imageName = "${HARBOR_URL}/${PROJECT}/${APP_NAME}:${commitId}"
                    image = docker.build(imageName)
                    echo "Built image: ${imageName}"
                }
            }
        }
        stage('Run Trivy Scan') {
            steps {
                script {
                    def path = "/var/jenkins_home/scanner/trivy-scan/${env.project}"
                    def file = "${env.APP_NAME}-trivy-report-${env.commitId}.html"
                    def repo = "${HARBOR_URL}/${PROJECT}/${APP_NAME}"

                    sh "mkdir -p ${path} ${path}/.cache"
                    sh """
                        docker run --pull always --rm --network host \
                        -e TRIVY_USERNAME=${env.HARBOR_USER} \
                        -e TRIVY_PASSWORD=${env.HARBOR_PASS} \
                        -v /var/run/docker.sock:/var/run/docker.sock \
                        -v ${path}/.cache/:/tmp/.cache/ \
                        -v ${path}:/tmp/reports \
                        aquasec/trivy:latest image \
                            --format template \
                            --template "@contrib/html.tpl" \
                            --cache-dir "/tmp/.cache/trivy" \
                            -o /tmp/reports/${file} \
                            ${repo}:${env.commitId}
                    """

                }
            }
        }
        stage("Push Image to Registry") {
            steps {
                script {
                    def imageName = "${HARBOR_URL}/${PROJECT}/${APP_NAME}:${commitId}"
                    docker.withRegistry("https://${HARBOR_URL}", "${HARBOR_CRED}") {
                        image.push()
                        echo "Pushed image: ${imageName}"
                    }
                }
            }
        }
    }
}

อธิบาย Pipeline

FYI ตัว Trivy มันจะ Scan Image บน Local ก่อน ถ้าไม่เจอมันจะไปที่ Private Registry สามารถตั้งค่าให้สแกนจาก Private Registry อย่างเดียวก็ได้

Build Image ลง Local ก่อน ทำ Trivy Scan สามารถใส่เงื่อนต่างๆลงไปได้ สุดท้ายก็ Push Docker Image ไปที่ Harbor

  • กำหนดตัวแปรต่างๆที่ต้องใช้งาน def path = "/var/jenkins_home/scanner/trivy-scan/${env.project}" อันนี้จะเป็น Path สำหรับเก็บ Report ซึ่งจะเป็น Path ที่อยู่บน Jenkins Container และทำการสร้าง Directory ขึ้นมาบน Jenkins Container ก่อน
  • docker run --pull always --rm --network hostให้ Pull Image มาเสมอ --rm คือจะให้ลบ Trivy container ทิ้งเมื่อมัน Down ปกติมันจะทำงานประมาณ 5 วินาที แล้วมันก็จะ Down ไปเอง --network host จะใช้ Network ของเครื่อง Host ซึ่งอันนี้แล้วแต่ว่าเครื่องมี Policy หรือ Firewall สำหรับออก Internet ไหม ถ้าไม่มีก็สามารถลบออกได้
  • -e TRIVY_USERNAME และ -e TRIVY_PASSWORD เป็น env เพื่อให้ Trivy สามารถไป Scan Image ที่อยู่บน Private Registry ได้
  • -v /var/run/docker.sock:/var/run/docker.sock Mount docker.sock เพื่อให้ Trivy Container สามารถใช้งาน Docker ได้
  • -v ${path}/.cache/:/tmp/.cache/ จะ Mount .cache หรือไม่ Mount ก็ได้ มันเอาไว้โหลด Database สำหรับ Security เพื่อใช้ในการ Scan Image จะได้ไม่ต้องโหลด Database ทุกรอบที่มีการใช้ Trivy Container
  • -v ${path}:/tmp/reports จะเป็น Path หลักสำหรับเอา Report จากการทำ Trivy Scan
  • aquasec/trivy:latest image \ — format template \ — template “[@contrib/html](http://twitter.com/contrib/html).tpl” \ — cache-dir “/tmp/.cache/trivy” \ -o /tmp/reports/${file} \ ${repo}:${env.commitId} Report จะอยู่ที่ /tem/reports/${file} โดยจะเป็นไฟล์ HTML สามารถตั้งค่าให้เป็นไฟล์ .txt ก็ได้ ส่วน ${repo}:${env.commitId} คือ Image ที่จะถูก Scan โดยใช้ Trivy

5. ดูผลลัพธ์ ถ้าเกิด Error ให้แก้ตามอาการที่มันฟ้องออกมา

ใน Jenkins Container ที่ Path /var/jenkins_home/scanner/trivy-scan/banjo-only จะเห็นว่ามี Report nodejs-test-trivy-report-a497e586fa.html อยู่ ถ้าเปิดออกมาจะได้หน้าตาแบบนี้

การใช้งาน Jenkins DinD ร่วมกับ Trivy ก็จะประมาณนี้ครับ จะเห็นว่า Jenkins DinD สามารถ Integrate กับ Trivy ได้ไม่ยากเลยครับ อย่าลืมติดตามบทความถัดๆไปด้วยนะครับ ถ้าชอบก็อย่าลืมกดตบมือและแชร์เพื่อเป็นกำลังใจให้ผมด้วยนะครับ ขอบคุณครับ 🥳

Jenkins ep.5

[embed]มาใช้งาน Docker บน Jenkins แบบ DinD กันเถอะ — Jenkins ep.5 สวัสดีครับ วันนี้จะมาแชร์วิธีใช้งาน Docker บน Jenkins แบบ DinD นะครับ จะเป็นยังไงบ้าง มาเริ่มกันเลยครับmedium.com

Jenkins ep.4

[embed]มาใช้งาน Jenkins ร่วมกับ Trivy กันเถอะ — Jenkins ep.4 สวัสดีครับ วันนี้จะมาแชร์วิธีใช้งาน Jenkins ร่วมกับ Trivy นะครับ จะเป็นยังไงบ้าง มาเริ่มกันเลยครับmedium.com

Jenkins ep.3

[embed]มาใช้งาน Jenkins ร่วมกับ SonarQube กันเถอะ — Jenkins ep.3 สวัสดีครับ วันนี้จะมาแชร์วิธีใช้งาน Jenkins ร่วมกับ SonarQube นะครับ จะเป็นยังไงบ้าง มาเริ่มกันเลยครับmedium.com


메타데이터
post_id
d4eac32c6c0f
slug
มาใช้งาน-jenkins-dind-ร่วมกับ-trivy-กันเถอะ-jenkins-ep-4-1-d4eac32c6c0f
url
https://medium.com/@punthanatularnwiriyanont/%E0%B8%A1%E0%B8%B2%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-jenkins-dind-%E0%B8%A3%E0%B9%88%E0%B8%A7%E0%B8%A1%E0%B8%81%E0%B8%B1%E0%B8%9A-trivy-%E0%B8%81%E0%B8%B1%E0%B8%99%E0%B9%80%E0%B8%96%E0%B8%AD%E0%B8%B0-jenkins-ep-4-1-d4eac32c6c0f
canonical_url
https://medium.com/@punthanatularnwiriyanont/%E0%B8%A1%E0%B8%B2%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-jenkins-dind-%E0%B8%A3%E0%B9%88%E0%B8%A7%E0%B8%A1%E0%B8%81%E0%B8%B1%E0%B8%9A-trivy-%E0%B8%81%E0%B8%B1%E0%B8%99%E0%B9%80%E0%B8%96%E0%B8%AD%E0%B8%B0-jenkins-ep-4-1-d4eac32c6c0f
author_url
https://medium.com/@punthanatularnwiriyanont
status
ok
fetched_at
2026-06-15 20:49:13