Copier des fichiers de GCS dans un conteneur Docker Cloud Run pendant la construction

Nov 23 2020

J'essaie d'utiliser gsutilpour copier un fichier de GCS dans un conteneur Run pendant l'étape de construction.

Les étapes que j'ai essayées:

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

L'erreur:

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

Le compte de service (calcul par défaut et cloudbuild) a accès à GCS, et j'ai également essayé gsutil config -aet avec divers autres indicateurs sans succès!

Je ne sais pas exactement comment je dois m'authentifier pour accéder avec succès au seau.

Réponses

3 guillaumeblaquiere Nov 24 2020 at 21:31

Voici mon travail d'action 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

Vous devez définir 3 secrets:

  • SERVICE_ACCOUNT_KEY: qui est le fichier de clé de votre compte de service
  • SERVICE_NAME: le nom de votre conteneur
  • PROJECT_ID: le projet où déployer votre image

Étant donné que vous téléchargez le fichier localement, le fichier est localement présent dans la version Docker. Ensuite, copiez-le simplement dans le fichier docker et faites-en ce que vous voulez.


METTRE À JOUR

Si vous voulez faire cela dans docker, vous pouvez le faire comme ça

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

La commande de construction Docker

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

YOUR_KEY_FILE_CONTENT dépend de votre environnement. Voici une solution pour l'injecter:

  • Sur Github Action: ${{ secrets.SERVICE_ACCOUNT_KEY }}
  • Sur votre environnement local: $(cat my_key.json)
Pentium10 Nov 23 2020 at 21:26

Je vois que vous avez tagué Cloud Build,

Vous pouvez utiliser une étape comme celle-ci:

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']