Gitlab-ci กล้วยๆ: การดึง image จาก private registry
โดยทั่วไปการเขียน gitlab-ci จะมีคำสั่ง image:
ให้เราสามารถดึง image มาใช้งานใน Pipeline ได้ แต่มันจะเรียกได้เฉพาะ image ที่ถูกเก็บไว้ใน Publish registry เท่านั้น ถ้าเราจะเรียกจาก Private registry มันจะดึงลงมาใช้งานไม่ได้ เพราะติดสิทธิ์ในการเข้าถึง
และเราก็ไม่สามารถไปใช้คำสั่ง docker login
ได้ก่อนที่ Pipeline ทำงาน
ตัวอย่างรูปบน พอเรากำหนด image:
มันก็จะทำการดึง image นั้นลงมาให้ แต่เราไม่สามารถไปสั่ง docker login
ก่อนที่มันจะดึง image:
มาได้ ทำให้ถ้าเราไปเรียกจาก private registry มันก็จะดึงมาใช้ไม่ได้
ดังนั้นวิธีแก้ไขก็คือ เราต้องไปกำหนด DOCKER_AUTH_CONFIG
ให้กับโปรเจกต์นั้นๆ ก่อน ทำได้ดังนี้
สร้างไฟล์ Docker JSON configuration
ให้นำ user และ password ของ private registry มาเข้ารหัสก่อน
$ printf "my_username:my_password" | openssl base64 -A
# Example output to copy
bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ=
จากนั้นนำมาใส่ไว้ json
{
"auths": {
"registry.example.com:5000": {
"auth": "bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ="
}
}
}
1. กำหนดใน CI/CD variable
ไปที่โปรเจกต์ หรือกลุ่มใน Gitlab จากนั้นไปที่ Settings > CICD > Variables
ทำการสร้าง variables ที่ชื่อ DOCKER_AUTH_CONFIG
แล้วนำ json ที่สร้างไว้มาใส่ ตัวอย่างแบบรูปข้างบน
2. กำหนดใน Gitlab-runner
ทำการเพิ่ม DOCKER_AUTH_CONFIG
ใน gitlab-runner ของเรา
แก้ไขไฟล์ config.toml
ดังนี้
[[runners]]
environment = ["DOCKER_AUTH_CONFIG={\"auths\":{\"registry.example.com:5000\":{\"auth\":\"bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ=\"}}}"]
จากนั้น restart runner
เลือกทำข้อ 1. หรือ 2. ก็ได้ คราวนี้เราก็สามารถเรียก private registry ของเราใน image:
ที่อยู่ใน .gitlab-ci.yml
ไฟล์ได้แล้ว
image: registry.example.com:5000/namespace/image:tag
Thanks: https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#determine-your-docker_auth_config-data