Docker 映像部署在本地,但在 Google Cloud Run 上失败

cra*_*e99 6 python docker google-cloud-run

这是我的 Dockerfile:

# Use lightweight Python image
FROM python:3.9-slim

ARG DOCKER_ENV

# PYTHONFAULTHANDLER=1 - Display trace if a sefault occurs.
# PYTHONUNBUFFERED=1 - Allow statements and log messages to immediately appear in the Knative logs
# PIP_NO_CACHE_DIR=off - Disable pip cache for smaller Docker images.
# PIP_DISABLE_PIP_VERSION_CHECK=on - Ignore pip new version warning.
# PIP_DEFAULT_TIMEOUT=100 - Give pip longer than the 15 second timeout. 
ENV DOCKER_ENV=${DOCKER_ENV} \
  PYTHONFAULTHANDLER=1 \
  PYTHONUNBUFFERED=1 \
  PIP_NO_CACHE_DIR=off \
  PIP_DISABLE_PIP_VERSION_CHECK=on \
  PIP_DEFAULT_TIMEOUT=100

# Install poetry 
RUN pip install

# Set working directory in container to /app
WORKDIR /app

# Copy only dependency requirements to container to cache them in docker layer
COPY poetry.lock pyproject.toml /app/

# Don't need virtualenv because environment is already isolated in a container
RUN poetry config virtualenvs.create false

# Install production dependencies 
RUN poetry install --no-dev --no-ansi

# Copy app into container 
COPY . /app

# Run server
CMD [ "poetry", "run" , "python", "api.py"]
Run Code Online (Sandbox Code Playgroud)

我可以在本地构建和部署它,没有问题,并且服务器启动。但是,当我部署到 Cloud Run 时,出现以下错误并且容器失败:

Creating virtualenv indie-9TtSrW0h-py3.9 in /home/.cache/pypoetry/virtualenvs
File "/app/api.py", line 6, in <module>
    import jwt
ModuleNotFoundError: No module named 'jwt'
Run Code Online (Sandbox Code Playgroud)

有人知道为什么它在本地成功运行但在 Cloud Run 中缺少依赖项吗?一件奇怪的事情是我明确告诉 docker 不要在 Dockerfile 中使用虚拟环境。当我在本地运行映像时,这是有效的,但在 Google Cloud 上,它仍然坚持构建虚拟环境。是否与我在这里缺少的 Google Cloud Run 版本的 Docker 和诗歌存在某种不兼容?

Qba*_*ack 1

似乎出于某种原因,Cloud RunCMD在与Dockerfile. 这就是为什么poetry认为应该创建一个新的 virtualenv。

解决方法

(它在 2021 年 11 月 21 日对我有效)

代替

CMD [ "poetry", "run" , "python", "api.py"]
Run Code Online (Sandbox Code Playgroud)

使用:

CMD ["python", "api.py"]
Run Code Online (Sandbox Code Playgroud)

它应该可以工作,因为您的依赖项已经在没有 virtualenv 的poetry情况下安装,因此您现在不再需要。