We are not waiting for future, We create the future

Tags


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

4th January 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 ให้มันด้วยนะครับ :)

IT manager & DevOps @Twin Synergy Co.,Ltd

View Comments