Docker ใช้งาน Dockerfile เพื่อสร้าง Docker Image ของเราเอง


         Dockerfile คือการสร้าง Docker Image ในแบบของเราเอง หรือก็คือการ custom docker image นั่นแหละ ถึงแม้ว่าเราจะใช้ CLI เข้า container ได้เลย แต่จะดีกว่าไหมถ้าเราทำเป็น Docker Image ที่พร้อมใช้งาน ไม่ต้องมาคอยคิดว่าต้องลงอะไรบ้าง

Custom Image ทำไม ?

         การสร้าง container จำเป็นต้องใช้ parent image เสมอ ถึงแม้ว่า Docker Hub จะมีให้เราเลือกโหลดมากมาย แต่ตัวไหนล่ะที่ตรงใจเรา

ตัวอย่าง Dockerfile

         Dockerfile เป็นไฟล์ที่มี syntax เฉพาะของ Docker ลักษณะจะปะปนกับ shell script เพื่อเป็นชุดคำสั่งแรกเมื่อมีการสร้าง container นั่นเอง

คำสั่งใกล้เคียง $ docker run -p 8080:8080 jenkins


การใช้งาน Dockerfile

         ขั้นตอนการสร้าง container จากเดิมที่เป็นแค่การดึง image มาใช้ คราวนี้เราจะสามารถเพิ่มเติมคำสั่งบางอย่างเข้าไป สิ่งที่ parent image เตรียมมาก็สามารถใช้ได้ และเพิ่มเติมสิ่งที่เราเพิ่มไปได้อีก

มาลอง Custom Docker Image กัน

FROM jenkins

LABEL maintainer="LordGift"

USER root

RUN apt-get update && apt-get install -y android-sdk

ENV JENKINS_HOME /var/jenkins_home
ENV ANDROID_HOME /usr/lib/android-sdk
ENV PATH $ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$PATH

# Download and untar Android SDK tools
# RUN mkdir -p $ANDROID_HOME
RUN wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip -O sdk-tools.zip
RUN unzip -o sdk-tools.zip -d $ANDROID_HOME
RUN rm sdk-tools.zip

# Update and install using sdkmanager 
RUN yes | sdkmanager "platform-tools" "platforms;android-28"


ARG jenkins_default_port=8080
EXPOSE ${jenkins_default_port}

         Dockerfile นี้ได้มีการดึง jenkins มาเป็น parent image จากนั้นผมได้ลง Android SDK พร้อมทั้งเครื่องมือต่างๆ ที่ทำให้ container นี้สามารถ build Android ได้

         อย่าลืม build เพื่อให้ได้ image ไว้ใช้งาน (Dockerfile reference)
$ docker build -t custom-jenkins .
         จริงๆ แล้ว เรื่องของ Dockerfile ก็สิ้นสุดตรงนี้ล่ะนะ การประยุกต์ใช้ก็ขึ้นอยู่กับว่าอยากได้ container ที่ทำอะไรได้บ้าง แต่เพื่อความต่อเนื่องจาก post ก่อนหน้า เลยอยากทำให้อยู่ในรูปแบบของ Docker Compose ไปด้วย ไหนๆ ก็เขียน Dockerfile มาขนาดนี้แล้ว ก็ต้องเอาไปลองใช้ซะหน่อย

.....................................

ต่อจากนี้คือของแถม

Android Project ตัวอย่าง

         https://github.com/lordgift/android-automated-code-analysis

สิ่งที่อยากให้สังเกต มีดังนี้
  1. docker-compose.yml
  2. jenkins.Dockerfile (เหมือนตัวอย่างด้านบน)
  3. sonarqube.Dockerfile
         docker-compose ในตัวอย่างนี้จะแตกต่างจากเรื่องก่อนหน้า (Docker กับการสร้าง environment แบบ All-in-One) คือจะไม่ได้ดึง parent image โดยตรงแล้ว เพราะคราวนี้เราจะสร้างด้วย Dockerfile

ของเดิม (แบบใช้ image คนอื่น)
services:
  sonarqube:
    image: sonarqube
...

ของใหม่ (แบบใช้ Dockerfile)
services:
  sonarqube:
    build: 
      context: .
      dockerfile: sonarqube.Dockerfile
...

โดย docker จะสร้าง image ให้เราใหม่เอง หลังจากเรียกใช้คำสั่ง $ docker-compose up จากนั้นลองดู image ที่เกิดขึ้น
$ docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
android-automated-code-analysis_jenkins     latest              6608c1b12389        4 days ago          1.36GB
android-automated-code-analysis_sonarqube   latest              f290d14ef404        4 days ago          819MB
...

.....................................

         ถึงตรงนี้ ถึงแม้ว่าจะสามารถเข้าใช้งาน Jenkins (http://localhost:8080) และ SonarQube (http://localhost:9000) ได้ แต่ยังไม่จบวัตถุประสงค์ของโปรเจคตัวอย่าง โดยสิ่งที่เราต้องทำคือ

"Automated Code Analysis for Android"
คือให้ Jenkins (container #1) รันคำสั่ง gradle เพื่อส่งไปทำ code analysis ที่ SonarQube (container #2)

  • Android Project มีการเขียนเรียกใช้ plugin SonarQube และกำหนดปลายทางเป็น http://sonar:9000
  • Jenkins เราสามารถใช้คำสั่ง gradle ได้แล้ว (เพราะติดตั้ง SDK เรียบร้อย)
    • ต้องสร้าง pipeline project บน Jenkins เอง (ใช้ JenkinsFile หรือเขียน pipeline script**)
  • SonarQube ไม่มีการแก้ไขอะไรเพิ่มเติม
    • แต่อย่าลืมว่า http://sonar:9000 ต้องใช้งานจาก Jenkins' container เท่านั้น และ http://localhost:9000 ต้องใช้งานผ่านเครื่องเรา แต่มันคือ SonarQube's container ที่เดียวกัน (docker-compose.yml)
**รายละเอียดอยู่ที่ README ของโปรเจคตัวอย่าง

ผลการ build Jenkins และส่งมา analyse source code บน SonarQube
(ไม่เจอ Bug เลยเพราะว่าโปรเจคตัวอย่าง เป็นโปรเจคเปล่าๆ ครับ ฮ่าๆ)

จบ 3 เรื่อง เกี่ยวกับ Docker ที่อยากเขียนตอนนี้
         หากได้ลองเล่นผมคิดว่ามันสามารถเอาไปใช้ได้จริงตั้งแต่ dev จนถึง production บางครั้งเราแค่อยากลองเล่น tools ใหม่ๆ แต่ไม่กล้าลง หรือ version ชน หรืออื่นๆ สำหรับใน docker ถ้าเล่นแล้วพังเราก็ลบ container สร้างใหม่ ใช้ฝึกฝีมือทั้งเรื่องการใช้ tools, การ config network, การเขียน shell script ได้กันไปหลายอย่างแบบไม่ต้องกลัวเครื่องหลักจะมีปัญหากันเลยครับ

Facebook Comment

Recent Posts

Popular post of 7 days

Port Forwarding สำหรับคนใช้ AIS Fibre

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

Popular

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

มาตรฐานการตั้งชื่อตัวแปร (Naming Convention)

Port Forwarding สำหรับคนใช้ AIS Fibre

เรื่องของ ++i กับ i++

Android Auto & Apple Carplay คืออะไร ใช้งานยังไง

Deeplink, Universal Links คืออะไร ทำงานร่วมกับ Mobile App ได้ยังไง

วิธีการสมัคร Apple Developer Program และ Enterprise Program ฉบับลงมือเอง

พิมพ์ซองจากรายชื่อ excel ด้วยวิธี Mail Merge

ทดสอบ Mobile App แบบ Automated ด้วย Appium ทำยังไงกันนะ