Kaniko 오픈소스 대안 툴 추천부탁드립니다

저는 여러 개의 GitLab CI 잡을 운영하면서 Kaniko를 이용해 Docker 이미지를 빌드하고, 이를 제 개인 GitLab 레지스트리에 푸시하고 있습니다. 제 GitLab Runner는 Docker executor를 사용하며 privileged = false로 설정되어 있고, 이 환경에서는 지금까지 아무 문제 없이 잘 동작했습니다.

아래는 제 질문과 관련된 설정이 포함된 config.toml입니다.

[[runners]]
  executor = "docker"
  [runners.docker]
    image = "alpine:latest"
    privileged = false

처음에 사용하던 GitLab CI 설정은 다음과 같았습니다.

.kaniko_auth: &kaniko_auth
  - mkdir -p /kaniko/.docker
  - >
    echo '{
      "auths": {
        "'"$CI_REGISTRY"'": {
          "auth": "'"$(echo -n "$CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD" | base64)"'"
        },
        "registre.private.com/private/private": {
          "auth": "'"$(echo -n "$CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD" | base64)"'"
        }
      }
    }' > /kaniko/.docker/config.json

.kaniko:
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  before_script: *kaniko_auth

이 설정 파일을 .gitlab-ci.yml에 포함시켜서 아래와 같이 사용했습니다.

build_Golden_Complete:
  stage: build_docker
  extends: .kaniko
  parallel:
    matrix:
      - IMAGE_NAME: complete
        DOCKERFILE_PATH: ./ci_cd/DockerfileComplete
      - IMAGE_NAME: golden
        DOCKERFILE_PATH: ./ci_cd/DockerfileGolden
  script:
    - >
      /kaniko/executor
      --use-new-run
      --context "$CODE_DIRECTORY/"
      --dockerfile "$DOCKERFILE_PATH"
      --destination "$CONTAINER_IMAGE_BUILD:$SOME_TAG-$IMAGE_NAME"
      --build-arg "SRC_IMAGE=$SRC_IMAGE"
      --cache=true

그런데 최근 Dockerfile 중 하나를 업그레이드하면서 #syntax=docker/dockerfile:labs 지시어를 사용해야 할 필요가 생겼습니다.

하지만 기존에 쓰던 gcr.io/kaniko-project/executor:debug 이미지는 이 최신 문법을 지원하지 않는데, 이는 더 이상 유지 관리되지 않기 때문입니다. Google에서 원래 Kaniko 프로젝트를 아카이브했고, 현재는 Chainguard가 포크를 관리하고 있지만, 이들의 최신 업데이트 이미지는 유료 계정이 필요하거나 계정 등록이 필요합니다.

그래서 Buildah와 BuildKit 같은 대안을 찾아봤지만, 이들은 Docker의 기본 seccomp 프로필에서 차단하는 시스템 호출을 필요로 해서 실패했습니다. 제 worker의 config.toml에 security_opt = ["seccomp:unconfined"]를 추가하면 해결될 것 같긴 하지만, 저는 그런 방식 대신 Kaniko처럼 동작하면서도 최신 Dockerfile 문법을 지원하는 해법을 원합니다.

BuildKit을 시도하면서 GitLab 공식 문서를 참고했는데, 설정은 다음과 같습니다.

build-rootless:
  image:
    name: moby/buildkit:rootless
    entrypoint: [""]
  stage: build
  variables:
    BUILDKITD_FLAGS: --oci-worker-no-process-sandbox
  before_script:
    - mkdir -p ~/.docker
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > ~/.docker/config.json
  script:
    - |
      buildctl-daemonless.sh build \
        --frontend dockerfile.v0 \
        --local context=. \
        --local dockerfile=. \
        --output type=image,name=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA,push=true

하지만 실행 결과는 아래와 같았습니다.

could not connect to unix:///run/user/1000/buildkit/buildkitd.sock after 10 trials
========== log ==========
[rootlesskit:parent] error: failed to start the child: fork/exec /proc/self/exe: operation not permitted

Buildah를 시도했을 때도 마찬가지로 unshare syscall이 거부되어 실패했습니다.

Error during unshare(CLONE_NEWUSER): Operation not permitted

그래서 제가 묻고 싶은 것은, 표준적인 GitLab CI Docker executor 환경에서 privileged = false를 유지하면서도 최신 Dockerfile 문법을 지원하고, seccomp 기본 프로필을 해제하지 않아도 되는 무료이자 활발히 유지 관리되는 빌드 도구나 Kaniko의 특정 버전이 존재하는지입니다.

참고로, security_opt = ["seccomp:unconfined"]를 runner 설정에 추가해도 moby/buildkit:rootless에서는 해결되지 않았습니다. 결국 privileged = true로 실행되는 별도의 runner를 만들어서 임시로 문제를 우회했지만, 이는 장기적인 해결책이 아니고 단지 당장 막혀 있던 작업을 진행하기 위한 임시 방편일 뿐입니다.