在构建期间将文件从 GCS 复制到 Cloud Run docker 容器中

Posted

技术标签:

【中文标题】在构建期间将文件从 GCS 复制到 Cloud Run docker 容器中【英文标题】:Copy files from GCS into a Cloud Run docker container during build 【发布时间】:2021-03-06 05:46:32 【问题描述】:

我正在尝试在构建步骤中使用gsutil 将文件从 GCS 复制到运行容器中。

我尝试过的步骤:

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

服务帐户(默认计算和 cloudbuild)确实可以访问 GCS,我也尝试过 gsutil config -a 和其他各种标志,但均未成功!

我不确定应该如何进行身份验证才能成功访问存储桶。

【问题讨论】:

在您之前的问题中,您谈到了 github 操作。还是这样吗?如果没有,你在哪里构建你的容器? 是的,这需要在本地和 GH 操作上工作。 【参考方案1】:

我看到你标记了 Cloud Build,

您可以像这样使用步骤:

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

【讨论】:

对不起,这是我的一个错误 - 我需要在 Dockerfile 中发生这种情况。【参考方案2】:

这是我的 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)

【讨论】:

谢谢,但这不会很好,因为这只能通过 GH 操作工作 - 它需要在本地和通过操作工作 - 这就是为什么我认为最好在 Dockerfile 中完成 - 这可能吗?跨度> 我提出了一个解决方案。让我知道它是否更好 看起来不错 - 接受但稍后会测试!感谢您一直以来的帮助!

以上是关于在构建期间将文件从 GCS 复制到 Cloud Run docker 容器中的主要内容,如果未能解决你的问题,请参考以下文章

从 Google Cloud Storage 复制时排除特定文件或目录

将 GCS 文件加载到 BigQuery 的 Cloud Functions 的 Python 单元测试

将大量文件从 Google Cloud Storage 复制到 Google Colab,无需记录/打印

在 Maven 构建期间将文件夹从源复制到目标

从 AWS S3 转移到 Google-Cloud-Storage “未知”失败

将文件从 GCS 复制到 AWS S3 时如何设置 acl?