Dockerfile คือไฟล์ที่ไว้สร้าง docker image ตามที่เราต้องการ ใครที่ใช้งาน Docker ต้องเคยได้เขียน Dockerfile แน่นอนฉะนั้นผมจะไม่อธิบายเยอะ เจ็บมือ 🙂
ผมใช้ vscode ในเป็นเครื่องมือในการเขียนโค็ดต่างๆ และได้ลงปลั๊กอินชื่อ dockerfile-validator
เอาไว้เพื่อตรวจสอบว่า Dockerfile ที่เราเขียนไว้นั้นถูกต้องหรือป่าว และมันก็จะมี error ขึ้นมาแสดงทุกครั้งว่าเราต้องกำหนด label
ด้วยนะ
ตอนแรกผมก็ไม่ได้สนใจอะไร แต่หลังๆ เริ่มสงสัยว่าทำไมต้องกำหนด label
ด้วยฟ่ะ…
ก็เลยไปหาอ่านใน Dockerfile best practices ว่ามันต้องกำหนดด้วยนิวา โดยเราสามารถกำหนดค่าอะไรลงไปก็ได้
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 นี้ชื่ออะไร เวอร์ชั่นอะไร หรือใครเป็นเจ้าของ เป็นต้น
เมื่อเรากำหนด 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 .
เมื่อเรากำหนดไปแล้วคราวนี้เรามาดูวิธีตรวจสอบว่า 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 ให้มันด้วยนะครับ 🙂