我正在尝试使用 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 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}"
。