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

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

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

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

Popular

[Java] Java 8 DateTime ใหม่ ไฉไลกว่าเดิม

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

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

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

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

ลืมรหัสปลดล็อค Android เข้าเครื่องไม่ได้ มีทางออกครับ

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

[Java] Java Static Variable และ Static Method

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

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