Copier des fichiers de GCS dans un conteneur Docker Cloud Run pendant la construction
J'essaie d'utiliser gsutil
pour 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 -a
et 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
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)
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']