Kopieren Sie Dateien von GCS während des Builds in einen Cloud Run-Docker-Container
Ich versuche, gsutil
eine Datei aus GCS während des Erstellungsschritts in einen Run-Container zu kopieren.
Die Schritte, die ich versucht habe:
RUN pip install gsutil
RUN gsutil -m cp -r gs://BUCKET_NAME $APP_HOME/artefacts
Der Fehler:
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
Das Dienstkonto (Standardcompute & Cloudbuild) hat Zugriff auf GCS, und ich habe auch versucht, gsutil config -a
mit verschiedenen anderen Flags ohne Erfolg!
Ich bin mir nicht sicher, wie ich mich authentifizieren soll, um erfolgreich auf den Bucket zuzugreifen.
Antworten
Hier mein Github-Action-Job
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
Sie müssen 3 Geheimnisse setzen:
- SERVICE_ACCOUNT_KEY: Dies ist die Schlüsseldatei Ihres Dienstkontos
- SERVICE_NAME: Der Name Ihres Containers
- PROJECT_ID: Das Projekt, in dem Ihr Image bereitgestellt werden soll
Da Sie die Datei lokal herunterladen, ist sie im Docker-Build lokal vorhanden. Dann KOPIEREN Sie es einfach in die Docker-Datei und machen Sie damit, was Sie wollen.
AKTUALISIEREN
Wenn Sie dies in Docker tun möchten, können Sie dies auf diese Weise erreichen
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> .
....
Der Docker-Build-Befehl
docker build --build-arg KEY_FILE_CONTENT="YOUR_KEY_FILE_CONTENT" \
-t gcr.io/$PROJECT_ID/$SERVICE_NAME .
YOUR_KEY_FILE_CONTENT hängt von Ihrer Umgebung ab. Hier eine Lösung, um es zu injizieren:
- Über Github Action:
${{ secrets.SERVICE_ACCOUNT_KEY }}
- In Ihrer lokalen Umgebung:
$(cat my_key.json)
Ich sehe, dass Sie Cloud Build getaggt haben.
Sie können den folgenden Schritt verwenden:
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']