Программа запуска Gitlab с Kaniko и gcloud sdk

# #google-cloud-platform #gitlab #gitlab-ci-runner #kaniko

#google-облачная платформа #gitlab #gitlab-ci-runner #kaniko

Вопрос:

Я хочу создавать образы docker на Gitlab и использовать Kaniko для этого.

Это отлично работает, когда у меня есть только Dockerfile и код из репозитория. Проблема начинается, когда перед сборкой я хочу получить доступ к GCP Secret Manager и получить значения для этой сборки.

Мы создаем изображения непосредственно в Gitlab и сохраняем их в GCR.io .

Ниже приведен пример конфигурации gitlab-ci.yml. Когда мы используем image: Docker, это будет работать, поскольку мы можем использовать curl и т. Д. И установить cloud sdk. Но с Kaniko это невозможно.

 dev-build-docker:
  stage: build-docker-image
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  environment: Develop
  only:
    changes:
      - xxxxxxxxxxxx
    refs:
      - develop
  services:
    - docker:dind
  before_script:
    - source vars/.variables
    - echo $CICD_SA_KEY > ${CI_PROJECT_DIR}/service_key.json
    - export GOOGLE_APPLICATION_CREDENTIALS=${CI_PROJECT_DIR}/service_key.json
  script:
    - apk --no-cache add curl
    - apk add bash
    - curl https://sdk.cloud.google.com > install.sh
    - apt install -y python3
    - ./install.sh --disable-prompts
    - export PATH=$PATH:/root/google-cloud-sdk/bin
    - gcloud auth activate-service-account --key-file ${CI_PROJECT_DIR}/service_key.json
    - mkdir creds
    - gcloud secrets versions access latest --project=$projectid_dev --secret=xxxxxxxx > creds/dbpass
    - DB_PASS=$(cat creds/dbpass)
    - gcloud secrets versions access latest --project=$projectid_dev --secret=xxxxxxxxxx-key > creds/creds.2.json
    - gcloud secrets versions access latest --project=$projectid_dev --secret=zzzzzzzzzzzzzz-key > creds/creds.1.json

    # end of gcloud
    - /kaniko/executor --context "$(pwd)" --dockerfile "$(pwd)/Dockerfile" --destination eu.gcr.io/$projectid_dev/xxxxxxxxxxxx:$TAG --destination eu.gcr.io/$projectid_dev/xxxxxxxxxxxx:latest --build-arg NODE_ENV=production --build-arg DB_PASS=$DB_PASS
  

Kaniko использует busybox, и я не вижу способа установить gcp sdk и получить доступ к секретам. Кому-нибудь удалось использовать команды gcloud до Kaniko executor?

Комментарии:

1. Какой продукт GCP вы используете для развертывания? это облачная сборка?, не могли бы вы предоставить более подробную информацию о реализации вашего кода? Также может быть полезно добавить, как вы пытаетесь получить секреты

2. @FerVelvet Я отредактировал код задания. для полноты примера.

Ответ №1:

Из-за природы kaniko подход, который вы ищете, невозможен. Основная причина, как вы уже заметили, заключается в том, что busybox имеет ограниченный набор инструментов и его невозможно установить gcloud с его зависимостями.

Допустим, вы загружаете архивную версию gcloud и создаете свою собственную kaniko версию, копируя двоичные файлы Cloud SDK, но затем вы замечаете, что вам также понадобится python, что подразумевает его компиляцию, и это приводит к необходимости дополнительных библиотек и зависимостей, которые в конце кажутся не слишком удобными и создают kaniko очень большое изображение.

Итак, в конце концов, кажется, что лучший вариант — использовать Docker в подходе Docker. Другой обходной путь, который подразумевает дополнительный шаг, заключается в создании собственного образа kaniko, который содержит ваши секреты, например:

 FROM gcr.io/google.com/cloudsdktool/cloud-sdk as secrets
WORKDIR /creds
COPY ./key.json .
RUN gcloud auth activate-service-account --key-file=/secrets/key.json
WORKDIR /secrets
RUN gcloud secrets versions access latest --project=PROJECT_ID --secret=SECRET > creds_2.json


FROM gcr.io/kaniko-project/executor:debug
WORKDIR /build
COPY --from=secrets /secrets/creds_2.json .
  

Комментарии:

1. Один из способов — использовать артефакты gitlab, но я не слишком уверен, что нужно помещать туда секреты и переходить к работе с kaniko build.

2. Я переключился на использование GCP container builder для конвейеров, где мне нужно получить доступ к secret manager.