与Kaniko和gcloud sdk的Gitlab运行程序

问题描述

我想在Gitlab上构建docker映像并使用Kaniko。

当我只有Dockerfile和来自repo的代码时,它的工作效果很好。问题开始于构建之前,我想访问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和访问机密的方法。有没有人在Kaniko执行者之前设法使用过gcloud命令?

解决方法

由于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 .

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...