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สิ่งที่อยากให้สังเกต มีดังนี้
- docker-compose.yml
- jenkins.Dockerfile (เหมือนตัวอย่างด้านบน)
- sonarqube.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 ที่อยากเขียนตอนนี้
- Docker คืออะไร ? แนะนำวิธีใช้งานเบื้องต้น
- Docker กับการสร้าง environment แบบ All-in-One (Docker Compose)
- Docker ใช้งาน Dockerfile เพื่อสร้าง Docker Image ของเราเอง