如何在 Docker 中使用 GCP 服务帐户 json 文件

Mut*_*shi 0 docker google-cloud-platform

我正在对使用 Firebase 的 Fastapi 应用程序进行 dockerizing。我需要访问service json文件,并且我已经配置了我的 docker 容器,如下所示。

Dockerfile

FROM python:3.10-slim

ENV PYTHONUNBUFFERED 1

WORKDIR /app

# Install dependencies
COPY ./requirements.txt /requirements.txt
EXPOSE 8000

RUN pip install --no-cache-dir --upgrade -r /requirements.txt
   
RUN mkdir /env
# Setup directory structure
COPY ./app /app/app
COPY ./service_account.json /env
CMD ["uvicorn", "app.app:app", "--host", "0.0.0.0", "--port", "8000"]
Run Code Online (Sandbox Code Playgroud)

Docker-compose 文件

version: "3.9"

services:
  app:
    build:
      context: .
    restart: always
    environment:
      - GOOGLE_APPLICATION_CREDENTIALS_CLOUDAPI=${GOOGLE_APPLICATION_CREDENTIALS_CLOUDAPI}
      - GOOGLE_APPLICATION_CREDENTIALS=${GOOGLE_APPLICATION_CREDENTIALS}
    volumes:
      - ./env:/env

volumes:
  env:
Run Code Online (Sandbox Code Playgroud)

现在,当我运行容器时docker-compose up -d --build,容器失败并出现错误FileNotFoundError: [Errno 2] No such file or directory: '/env/service_account.json'。当我检查容器时,我可以看到ENV变量设置成功,如图所示"GOOGLE_APPLICATION_CREDENTIALS=/env/service_account.json",。现在为什么会失败呢?

cri*_*007 5

你有context: .COPY ./service_account.json /env

但是当你运行容器时,你有

volumes:
   - ./env:/env
Run Code Online (Sandbox Code Playgroud)

这意味着您的 service_acccount 文件不在./env文件夹中,而是在文件夹之外。

当您挂载卷时,它会替换容器内的目录,因此如果您需要像容器中env一样挂载本地文件夹,那么您应该将 JSON 文件移动到其他位置,例如( ),然后设置/env/optCOPY ./service_account.json /optGOOGLE_APPLICATION_CREDENTIALS=/opt/service_account.json

如果您不需要整个文件夹,那么您只需要

volumes:
   - ./service_account.json:/env/service_account.json:ro
Run Code Online (Sandbox Code Playgroud)

否则,将 JSON 文件移动到./env您的主机上并更改COPY ./env/service_account.json /env