ビルド中にGCSからCloudRunDockerコンテナにファイルをコピーします

Nov 23 2020

gsutilビルドステップ中にGCSからRunコンテナにファイルをコピーするために使用しようとしています。

私が試した手順:

RUN pip install gsutil
RUN gsutil -m cp -r gs://BUCKET_NAME $APP_HOME/artefacts

エラー:

ServiceException: 401 Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.
CommandException: 1 file/object could not be transferred.
The command '/bin/sh -c gsutil -m cp -r gs://BUCKET_NAME $APP_HOME/artefacts' returned a non-zero code: 1
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/docker" failed: step exited with non-zero status: 1

サービスアカウント(デフォルトのcompute&cloudbuild)はGCSにアクセスできます。また、gsutil config -a他のさまざまなフラグを使用して試みましたが、成功しませんでした。

バケットに正常にアクセスするためにどのように認証する必要があるのか​​正確にはわかりません。

回答

3 guillaumeblaquiere Nov 24 2020 at 21:31

ここに私のgithubアクションジョブ

jobs:
  build:
    name: Build image
    runs-on: ubuntu-latest

    env:
      BRANCH: ${GITHUB_REF##*/} SERVICE_NAME: ${{ secrets.SERVICE_NAME }}
      PROJECT_ID: ${{ secrets.PROJECT_ID }} steps: - name: Checkout uses: actions/checkout@v2 # Setup gcloud CLI - uses: google-github-actions/setup-gcloud@master with: service_account_key: ${{ secrets.SERVICE_ACCOUNT_KEY }}
          project_id: ${{ secrets.PROJECT_ID }} export_default_credentials: true # Download the file locally - name: Get_file run: |- gsutil cp gs://BUCKET_NAME/path/to/file . # Build docker image - name: Image_build run: |- docker build -t gcr.io/$PROJECT_ID/$SERVICE_NAME . # Configure docker to use the gcloud command-line tool as a credential helper - run: | gcloud auth configure-docker -q # Push image to Google Container Registry - name: Image_push run: |- docker push gcr.io/$PROJECT_ID/$SERVICE_NAME

あなたは3つの秘密を設定する必要があります:

  • SERVICE_ACCOUNT_KEY:これはサービスアカウントのキーファイルです
  • SERVICE_NAME:コンテナの名前
  • PROJECT_ID:イメージをデプロイするプロジェクト

ファイルをローカルにダウンロードするため、ファイルはDockerビルドにローカルに存在します。次に、Dockerファイルにコピーして、必要な処理を実行します。


更新

Dockerでこれを実行したい場合は、このように実現できます

Dockerfile

FROM google/cloud-sdk:alpine as gcloud
WORKDIR /app
ARG KEY_FILE_CONTENT
RUN echo $KEY_FILE_CONTENT | gcloud auth activate-service-account --key-file=- \
  && gsutil cp gs://BUCKET_NAME/path/to/file .

....
FROM <FINAL LAYER>
COPY --from=gcloud /app/<myFile> .
....

Dockerビルドコマンド

docker build --build-arg KEY_FILE_CONTENT="YOUR_KEY_FILE_CONTENT" \
  -t gcr.io/$PROJECT_ID/$SERVICE_NAME .

YOUR_KEY_FILE_CONTENTは、環境によって異なります。ここにそれを注入するためのいくつかの解決策があります:

  • Githubアクションについて: ${{ secrets.SERVICE_ACCOUNT_KEY }}
  • ローカル環境: $(cat my_key.json)
Pentium10 Nov 23 2020 at 21:26

CloudBuildのタグが付けられているようです。

次のような手順を使用できます。

steps:
- name: gcr.io/cloud-builders/gsutil
  args: ['cp', 'gs://mybucket/results.zip', 'previous_results.zip']
# operations that use previous_results.zip and produce new_results.zip
- name: gcr.io/cloud-builders/gsutil
  args: ['cp', 'new_results.zip', 'gs://mybucket/results.zip']