Gitlab-ci กล้วยๆ: การดึง image จาก private registry

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

Arnon Kijlerdphon

Arnon Kijlerdphon

Board game & Plant-based & Minimalist, it's all my life.
Bangkok, Thailand