通过 github 工作流程进行 Docker 构建在尝试传递多个构建参数时失败

问题描述 投票:0回答:1

我正在尝试使用 docker 和 github 工作流程将 Flask 应用程序部署到 gcp。我在 github 中添加了一些变量和秘密,我试图将其作为 build args 通过我的工作流程 yaml 文件(我稍后在我的代码中使用 os.getenv() 使用) 这给了我一个错误 -

json 秘密错误

run docker buildx build --build-arg MGL_BASE_URL="<url>" --build-arg MGL_LOGIN_URL="<login_url>" --build-arg FIREBASE_DATABASE_URL="<db_url>" --build-arg GCP_SA_KEY_PRF_SELECTOR="***
docker buildx build --build-arg MGL_BASE_URL="<url>" --build-arg MGL_LOGIN_URL="<login_url>" --build-arg FIREBASE_DATABASE_URL="<db_url>" --build-arg GCP_SA_KEY_PRF_SELECTOR="***
    ***
    ***
    ***
    ***
    ***
    ***
    ***
    ***
    ***
    ***
    ***
  ***
  " -t gcr.io/<pid>/profile-extractor .
  docker push gcr.io/<pid>/profile-extractor
  shell: /usr/bin/bash -e ***0***
  
ERROR: "docker buildx build" requires exactly 1 argument.
See 'docker buildx build --help'.

Usage:  docker buildx build [OPTIONS] PATH | URL | -

这就是我的deploy.yml和dockerfile的样子-

部署.yml

name: Deploy to Cloud Run

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Set up Cloud SDK
      uses: google-github-actions/setup-gcloud@v0
      with:
        version: 'latest'
        service_account_key: ${{ secrets.GCP_SA_KEY_PRF_EXTRACTOR }}

    - name: Configure Docker
      run: gcloud auth configure-docker

    - name: Build and push Docker image
      env:
        MGL_BASE_URL: ${{ vars.MGL_BASE_URL }}
        MGL_LOGIN_URL: ${{ vars.MGL_LOGIN_URL }}
        FIREBASE_DATABASE_URL: ${{ vars.FIREBASE_DATABASE_URL }}
        GCP_SA_KEY_PRF_SELECTOR: ${{ secrets.GCP_SA_KEY_PRF_SELECTOR }}
      run: |
        docker build \
                     -t gcr.io/${{ vars.PRF_EXTRACTOR_GCP_PROJECT_ID }}/profile-extractor . \
                     --build-arg MGL_BASE_URL="${{ vars.MGL_BASE_URL }}" \
                     --build-arg MGL_LOGIN_URL="${{ vars.MGL_LOGIN_URL }}" \
                     --build-arg FIREBASE_DATABASE_URL="${{ vars.FIREBASE_DATABASE_URL }}" \
                     --build-arg GCP_SA_KEY_PRF_SELECTOR="${{ secrets.GCP_SA_KEY_PRF_SELECTOR }}"
        docker push gcr.io/${{ vars.PRF_EXTRACTOR_GCP_PROJECT_ID }}/profile-extractor

    - name: Deploy to Cloud Run
      run: |
        gcloud run deploy profile-extractor --image gcr.io/${{ vars.PRF_EXTRACTOR_GCP_PROJECT_ID }}/profile-extractor --platform managed --region asia-south2 --allow-unauthenticated --project ${{ vars.PRF_EXTRACTOR_GCP_PROJECT_ID }}

Dockerfile

# Use the official Python image from the Docker Hub
FROM python:3.9-slim

# Set the working directory in the container
WORKDIR /app

# Copy the requirements file into the container
COPY requirements.txt .

# Install the dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Copy the rest of the application code into the container
COPY . .

# Pass environment variables as build arguments
ARG MGL_BASE_URL
ARG MGL_LOGIN_URL
ARG FIREBASE_DATABASE_URL
ARG GCP_SA_KEY_PRF_SELECTOR

# Set environment variables in the container
ENV MGL_BASE_URL=$MGL_BASE_URL
ENV MGL_LOGIN_URL=$MGL_LOGIN_URL
ENV FIREBASE_DATABASE_URL=$FIREBASE_DATABASE_URL
ENV GCP_SA_KEY_PRF_SELECTOR=$GCP_SA_KEY_PRF_SELECTOR

# Set environment variables
ENV PORT=8080

# Command to run the application
CMD ["gunicorn", "-b", ":8080", "app:app"]

我试图消除这个秘密

--build-arg GCP_SA_KEY_PRF_SELECTOR="${{ secrets.GCP_SA_KEY_PRF_SELECTOR }}"

因为这是作为 json 添加的,所以我认为多行秘密可能会导致问题,因为其他变量只是一行字符串。但它仍然失败并出现同样的错误。

没有 json 秘密的错误

run docker buildx build --build-arg MGL_BASE_URL="<url>" --build-arg MGL_LOGIN_URL="<login_url>" --build-arg FIREBASE_DATABASE_URL="<db_url>"
docker buildx build --build-arg MGL_BASE_URL="<url>" --build-arg MGL_LOGIN_URL="<login_url>" --build-arg FIREBASE_DATABASE_URL="<db_url>" -t gcr.io/<pid>/profile-extractor .
      docker push gcr.io/<pid>/profile-extractor
      shell: /usr/bin/bash -e ***0***
      
    ERROR: "docker buildx build" requires exactly 1 argument.
    See 'docker buildx build --help'.
    
    Usage:  docker buildx build [OPTIONS] PATH | URL | -
docker flask google-cloud-platform github-actions
1个回答
0
投票

这里有两个问题,第二个更容易回答。当此命令更改为:

        docker build \
                     -t gcr.io/${{ vars.PRF_EXTRACTOR_GCP_PROJECT_ID }}/profile-extractor . \
                     --build-arg MGL_BASE_URL="${{ vars.MGL_BASE_URL }}" \
                     --build-arg MGL_LOGIN_URL="${{ vars.MGL_LOGIN_URL }}" \
                     --build-arg FIREBASE_DATABASE_URL="${{ vars.FIREBASE_DATABASE_URL }}" \
                     --build-arg GCP_SA_KEY_PRF_SELECTOR="${{ secrets.GCP_SA_KEY_PRF_SELECTOR }}"
        docker push gcr.io/${{ vars.PRF_EXTRACTOR_GCP_PROJECT_ID }}/profile-extractor

删除最后一个构建参数,例如:

        docker build \
                     -t gcr.io/${{ vars.PRF_EXTRACTOR_GCP_PROJECT_ID }}/profile-extractor . \
                     --build-arg MGL_BASE_URL="${{ vars.MGL_BASE_URL }}" \
                     --build-arg MGL_LOGIN_URL="${{ vars.MGL_LOGIN_URL }}" \
                     --build-arg FIREBASE_DATABASE_URL="${{ vars.FIREBASE_DATABASE_URL }}" \
        docker push gcr.io/${{ vars.PRF_EXTRACTOR_GCP_PROJECT_ID }}/profile-extractor

您留在上一行的

\
中,以便
docker push
命令作为附加参数传递给
docker build
命令。删除反斜杠来解决这个问题。

第一个问题,为什么构建参数不起作用,是因为您在运行命令之前扩展了 GHA 中的 shell 变量,而不是使用提供的环境变量。在这种情况下,您已经将变量作为环境变量传递,因此您可以跳过 GHA 内联这些值的部分:

    - name: Build and push Docker image
      env:
        MGL_BASE_URL: ${{ vars.MGL_BASE_URL }}
        MGL_LOGIN_URL: ${{ vars.MGL_LOGIN_URL }}
        FIREBASE_DATABASE_URL: ${{ vars.FIREBASE_DATABASE_URL }}
        GCP_SA_KEY_PRF_SELECTOR: ${{ secrets.GCP_SA_KEY_PRF_SELECTOR }}
      run: |
        docker build \
                     -t gcr.io/${{ vars.PRF_EXTRACTOR_GCP_PROJECT_ID }}/profile-extractor . \
                     --build-arg MGL_BASE_URL \
                     --build-arg MGL_LOGIN_URL \
                     --build-arg FIREBASE_DATABASE_URL \
                     --build-arg GCP_SA_KEY_PRF_SELECTOR
        docker push gcr.io/${{ vars.PRF_EXTRACTOR_GCP_PROJECT_ID }}/profile-extractor

如果变量名称不同,您可以使用

--build-arg SOME_ARG_NAME="${SOME_ENV_VAR_NAME}"

© www.soinside.com 2019 - 2024. All rights reserved.