Giới thiệu #
Việc tạo Docker image có lẽ đã không còn quá xa lạ đối với mọi người trong thời buổi hiện nay. Với Docker image, người dùng có thể triển khai phần mềm của mình ở bất cứ nơi đâu, miễn là nơi đó đã được cài đặt Docker. Người dùng có thể sử dụng Gitlab-CI để tự động hóa quá trình tạo và lưu trữ Docker image của mình một cách dễ dàng.
Kaniko là một trong những công cụ hỗ trợ tạo container image từ Dockerfile, thông qua một container hoặc Kubernetes cluster. Công cụ này giải quyết được 2 vấn đề gặp phải khi sử dụng “Docker-in-Docker” khi tạo container image:
- Bảo mật: không yêu cầu chế độ đặc quyền (privileged mode)
- Hiệu suất: thời gian xử lý và hiệu suất tốt hơn so với Docker-in-Docker
Yêu cầu #
Để có thể sử dụng kaniko với Gitlab, runner cần được cấu hình sử dụng một trong các executor sau:
- Kubernetes
- Dockerr
- Docker machine
Lưu ý #
Khi tạo image với kaniko và Gitlab CI/CD, người dùng cần lưu ý một số vấn đề sau:
- Nên sử dụng kaniko debug image (gcr.io/kaniko-project/executor:debug) vì image này hỗ trợ “shell”, thành phần bắt buộc để tạo image với Gitlab CI/CD.
- “entrypoint” cần được ghi đè thì script build mới có thể hoạt động bình thường.
- Để “push image” lên container registry, người dùng sẽ cần phải tạo một tập tin “config.json” chứa thông tin dùng để xác thực quyền truy cập registry của runner.
Các bước thực hiện #
- Cài đặt Docker trên server
- Cài đặt Gitlab runner (Ubuntu, Centos, Windows, macOS)
- Đăng ký runner với executor là “docker”. Ví dụ:
sudo gitlab-runner register -n \ --url <Gitlab Domain> \ --registration-token <Token> \ --executor docker \ --docker-image "gcr.io/kaniko-project/executor:debug" \ --description "Tel4vn Docker executor - Kaniko"
- Thêm “gitlab-runner” vào group được sử dụng Docker:
sudo usermod -aG docker gitlab-runner
- Kiểm tra “gitlab-runner” đã có thể sử dụng Docker hay chưa bằng câu lệnh sau:
sudo -u gitlab-runner -H docker info
- Khởi tạo job tạo Docker image với kaniko trong file “.gitlab-ci.yml“:
build_image: stage: build // Khai báo job này thuộc stage "build" (có thể xóa nếu muốn) image: name: gcr.io/kaniko-project/executor:debug entrypoint: [""] before_script: // Câu lệnh dùng để đăng nhập vào Container Registry trên Gitlab - mkdir -p /kaniko/.docker - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json script: // Tạo và lưu Docker image trên Container Registry - >- /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}"
Trong đó:
- CI_COMMIT_SHA: mã băm SHA-1 của commit kích hoạt CI/CD job dùng để tạo tag cho image. Bạn có thể thay thế nếu muốn
- CI_PROJECT_DIR: đường dẫn đầy đủ của repository sau khi runner đã clone về.
- CI_REGISTRY: Domain của Container Registry trên Gitlab
- CI_REGISTRY_IMAGE: Domain của Container Registry của repository/project trên Gitlab
- CI_REGISTRY_PASSWORD: mật khật dùng để đăng nhập vào Container Registry của Runner. Giá trị này tương đương với CI_JOB_TOKEN, và có thể sử dụng khi “job” vẫn còn đang xử lý. Nếu như job đã dừng vì bất kỳ lý do nào thì “mật khẩu” này sẽ không còn sử dụng được nữa
- CI_REGISTRY_USER: user mặc định của gitlab-runner sử dụng để đăng nhập vào Gitlab Registry
Các giá trị này được lấy từ biến môi trường của Gitlab runner, người dùng có thể thay đổi các thông tin nếu không muốn sử dụng Container registry của Gitlab.
Trong trường hợp bạn cần xác thực với “Dependency Proxy”, người dùng cần thêm một số biến CI/CD vào trong tập tin “config.json” thông qua câu lệnh sau (trong phần “before_script” của job bên trên):
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
Trong đó:
- CI_DEPENDENCY_PROXY_SERVER: Server dùgn để đăng nhập Dependency Proxy (tương đương với: $CI_SERVER_HOST:$CI_SERVER_PORT)
- CI_DEPENDENCY_PROXY_USER: Username dùng để pull image thông qua Dependency proxy.
- CI_DEPENDENCY_PROXY_PASSWORD: Password dùng để pull image thông qua Dependency proxy.
Tạo Docker image với kaniko thông qua Proxy #
Trong trường hợp Gitlab runner của bạn hoạt động phía sau một HTTP(s) Proxy, kaniko sẽ cần được cấu hình thêm thông tin proxy này để có thể push image lên Container registry thành công nhé. Job tạo Docker image sẽ có nội dung như sau:
build_image: stage: build // Khai báo job này thuộc stage "build" (có thể xóa nếu muốn) image: name: gcr.io/kaniko-project/executor:debug entrypoint: [""] before_script: // Câu lệnh dùng để đăng nhập vào Container Registry trên Gitlab - mkdir -p /kaniko/.docker - |- KANIKOPROXYBUILDARGS="" KANIKOCFG="\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}" if [ "x${http_server}" != "x" -o "x${https_server}" != "x" ]; then KANIKOCFG="${KANIKOCFG}, \"proxies\": { \"default\": { \"httpProxy\": \"${http_server}\", \"httpsProxy\": \"${https_server}\", \"noProxy\": \"${no_proxy}\"}}" KANIKOPROXYBUILDARGS="--build-arg http_proxy=${http_server} --build-arg https_proxy=${http_server} --build-arg no_proxy=${no_proxy}" fi KANIKOCFG="{ ${KANIKOCFG} }" echo "${KANIKOCFG}" > /kaniko/.docker/config.json script: // Tạo và lưu Docker image trên Container Registry - >- /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" "${KANIKOPROXYBUILDARGS}" --destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}"
Trong đó:
- http_server / https_server: thông tin Proxy server
- no_proxy: danh sách các domain không “đi qua” proxy
Xem thêm #
- Phần 1: Giới thiệu tổng quan về Gitlab Runner
- Phần 2: Các loại Runner Executor trong Gitlab CI
- Phần 3: Hướng dẫn cài đặt Gitlab Runner trên Ubuntu / Centos / Windows / macOS
- Phần 4: Các thành phần cơ bản trong file “.gitlab-ci.yml”
- Phần 5: Tạo Docker Image với Gitlab runner – Shell Executor
- Phần 5: Tạo Docker Image với Gitlab runner – Bind Docker socket
- Phần 5: Tạo Docker Image với Gitlab runner – Docker in Docker (Dind)
- Phần 6: Deploy AWS Lambda với Gitlab-CI và Serverless Framework
- Phần 7: Lưu trữ Terraform state trên Gitlab
Nguồn tham khảo: Gitlab
Trung tâm đào tạo Viễn thông và Công nghệ thông tin TEL4VN (TEL4VN) chuyên đào tạo các khóa học về DevOps như: Docker, Kubernetes, Ansible, Jenkins, Linux…….Ngoài ra, TEL4VN còn là Trung tâm đào tạo duy nhất về VoIP mã nguồn mở. 🌐Website: https://tel4vn.edu.vn/ |