Helpex - Trao đổi & giúp đỡ Đăng nhập

Xây dựng hình ảnh Docker mà không có Docker

Kaniko là một dự án do Google khởi chạy cho phép xây dựng Dockerfiles mà không cần Docker hoặc daemon Docker.

Kaniko có thể được sử dụng bên trong Kubernetes để tạo hình ảnh Docker và đẩy nó vào sổ đăng ký, hỗ trợ đăng ký Docker, Đăng ký vùng chứa Google và AWS ECR, cũng như bất kỳ đăng ký nào khác được hỗ trợ bởi trình trợ giúp thông tin xác thực Docker .

Giải pháp này vẫn không an toàn, vì các vùng chứa chạy dưới quyền root , nhưng nó là cách tốt hơn so với việc gắn ổ cắm Docker và khởi chạy các vùng chứa trong máy chủ. Đối với một, không có tài nguyên hoặc vùng chứa bị rò rỉ nào đang chạy bên ngoài bộ lập lịch.

Để khởi chạy Kaniko từ Jenkins trong Kubernetes, bạn chỉ cần một mẫu tác nhân sử dụng hình ảnh Kaniko tùy chỉnh (chỉ để có mèo và nohup) và một bí mật của Kubernetes với thông tin đăng ký hình ảnh, như được hiển thị trong đường dẫn ví dụ này .

CẬP NHẬT: một số thay đổi cần thiết cho Kaniko mới nhất

/**
 * This pipeline will build and deploy a Docker image with Kaniko
 * https://github.com/GoogleContainerTools/kaniko
 * without needing a Docker host
 *
 * You need to create a jenkins-docker-cfg secret with your docker config
 * as described in
 * https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-in-the-cluster-that-holds-your-authorization-token
 */

def label = "kaniko-${UUID.randomUUID().toString()}"

podTemplate(name: 'kaniko', label: label, yaml: """
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: gcr.io/kaniko-project/executor:debug
    imagePullPolicy: Always
    command:
    - /busybox/cat
    tty: true
    volumeMounts:
      - name: jenkins-docker-cfg
        mountPath: /root
  volumes:
  - name: jenkins-docker-cfg
    projected:
      sources:
      - secret:
          name: regcred
          items:
            - key: .dockerconfigjson
              path: .docker/config.json
"""
  ) {

  node(label) {
    stage('Build with Kaniko') {
      git 'https://github.com/jenkinsci/docker-jnlp-slave.git'
      container(name: 'kaniko', shell: '/busybox/sh') {
          sh '''#!/busybox/sh
          /kaniko/executor -f `pwd`/Dockerfile -c `pwd` --insecure-skip-tls-verify --destination=mydockerregistry:5000/myorg/myimage
          '''
      }
    }
  }
}

Ưu điểm:

  • Không cần gắn kết Docker socket hoặc có Docker binary
  • Không có vùng chứa đi lạc nào đang chạy bên ngoài bộ lập lịch

Nhược điểm:

  • Vẫn không an toàn
  • Chưa hỗ trợ cú pháp Dockerfile đầy đủ

Skaffold cũng có hỗ trợ cho Kaniko và có thể được sử dụng trong đường ống Jenkins X của bạn, sử dụng Skaffold để trừu tượng hóa việc xây dựng hình ảnh.

21 hữu ích 0 bình luận 12k xem chia sẻ

Có thể bạn quan tâm

loading