[Dockerfile] มากำหนด label กัน

DevOps Jan 04, 2019

Dockerfile คือไฟล์ที่ไว้สร้าง docker image ตามที่เราต้องการ ใครที่ใช้งาน Docker ต้องเคยได้เขียน Dockerfile แน่นอนฉะนั้นผมจะไม่อธิบายเยอะ เจ็บมือ :)

ผมใช้ vscode ในเป็นเครื่องมือในการเขียนโค็ดต่างๆ และได้ลงปลั๊กอินชื่อ dockerfile-validator เอาไว้เพื่อตรวจสอบว่า Dockerfile ที่เราเขียนไว้นั้นถูกต้องหรือป่าว และมันก็จะมี error ขึ้นมาแสดงทุกครั้งว่าเราต้องกำหนด label ด้วยนะ

ตอนแรกผมก็ไม่ได้สนใจอะไร แต่หลังๆ เริ่มสงสัยว่าทำไมต้องกำหนด label ด้วยฟ่ะ...

ก็เลยไปหาอ่านใน Dockerfile best practices ว่ามันต้องกำหนดด้วยนิวา โดยเราสามารถกำหนดค่าอะไรลงไปก็ได้

วิธีกำหนด label

label syntax

LABEL <key>=<value> <key>=<value> <key>=<value> …

หรือสามารถเขียนแบบนี้ได้

LABEL vendor=ACME\
      com.example.is-beta= \
      com.example.is-production="" \
      com.example.version="0.0.1-beta" \
      com.example.release-date="2015-02-12"

จากตัวอย่างด้านบนเราจะมองออกแล้วว่าทำไมต้องกำหนด label เพื่อเป็นตัวบอกว่า image นี้ชื่ออะไร เวอร์ชั่นอะไร หรือใครเป็นเจ้าของ เป็นต้น

ค้นหา image จาก label

เมื่อเรากำหนด label แล้วเราก็สามารถค้นหา image ในเครื่องได้จาก label เช่นกัน

$ docker images --filter "label=com.example.version=1.0"

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
match-me            latest              511136ea3c5a        About a minute ago   188.3 MB

ดูเพิ่มเติม: https://docs.docker.com/engine/reference/commandline/images/#filtering

จะเห็นว่าเราสามารถกำหนด label แบบไหนก็ได้ลงไป ผมก็เลยสงสัยเพิ่มเติมว่า แล้วส่วนใหญ่เขากำหนดกันยังไงวะ มันมีมาตราฐานอะไรหรือป่าว? ผมก็ไปค้นพบว่ามันมีแล้วในการกำหนด label ให้เป็นมาตราฐาน สามารถดูเพิ่มได้ที่ http://label-schema.org/ ซึ่ง ณ. ตอนนี้ยังเป็นเวอร์ชั่น RC1 อยู่

โดยทั่วไปผมจะกำหนดเป็นแบบนี้

LABEL name="app name" \
    version="1.0.0" \
    env="development" \
    org.label-schema.url="https://example.com" \
    org.label-schema.vcs-url="https://gitlab.com/twinapp/awesome-app" \
    org.label-schema.vendor="Twin synergy"

คราวนี้เรามาลองเพิ่มลูกเล่นให้กับ label กันสักหน่อย หากใครทำ CI/CD ก็จะต้องมีการเขียนให้มัน build image อัตโนมัติไว้แล้ว

จากตัวอย่างด้านบน ค่า version จะต้องมีการเปลี่ยนตลอดเวลาอยู่แล้ว หรือค่า env ที่ผมกำหนดไว้เพื่อบอกว่า image นี้มันอยู่ใน environment ไหน มันจึงต้องเปลี่ยนได้ในทุกครั้งที่สั่ง build

เราจำเป็นต้องเพิ่ม ARG เข้ามาด้วย ผมขอแก้โค็ดเป็นดังนี้

ARG arg_version
ARG arg_env
LABEL name="app name" \
    version=$arg_version \
    env=$arg_env \
    org.label-schema.url="https://example.com" \
    org.label-schema.vcs-url="https://gitlab.com/twinapp/awesome-app" \
    org.label-schema.vendor="Twin synergy"

เวลาสั่ง build ก็ตามนี้

docker build \
--build-arg arg_env=development \
--build-arg arg_version=1.0.0 \
-t registry.gitlab.com/twinapp/awesome-app:dev-release-1.0 \
-f Dockerfile.dev .

ตรวจสอบ Label ใน docker image

เมื่อเรากำหนดไปแล้วคราวนี้เรามาดูวิธีตรวจสอบว่า image ที่สร้างนั้นมี Label อะไร

$ docker inspect image_name:tag_name
...
...
...
"Labels": {
                "environment": "development",
                "name": "app name",
                "org.label-schema.url": "https://example.com/",
                "org.label-schema.vcs-url": "https://gitlab.com/twinapp/awesome-app",
                "org.label-schema.vendor": "Twin Synergy",
                "version": "1.0.0"
            }
...
...
...

สุดท้ายผมแนะนำว่าในทุกครั้งที่สร้าง Dockerfile จำเป็นต้องกำหนด Label ให้มันด้วยนะครับ :)

Arnon Kijlerdphon

IT manager & DevOps @Twin Synergy Co.,Ltd

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.