无法在 Google Cloud Run 上部署 Ubuntu 20.04 Docker 容器

dst*_*ley 9 ubuntu docker google-cloud-run

我正在尝试通过 Google Cloud Run 部署一个基于 Ubuntu 20.04 的简单的基于 Python 的 Docker 容器。我已经成功构建了映像,但是当我尝试部署 Cloud Run 服务时,出现以下错误(省略了项目详细信息):

Cloud Run error: Invalid argument error. Invalid ENTRYPOINT. [name: "gcr.io/{PROJECT_ID}/{SERVICE_NAME}@sha256:{HASH}"
error: "Invalid command \"/bin/sh\": fil
  e not found"
  e not found"
]....failed
Deployment failed
Run Code Online (Sandbox Code Playgroud)

不过,奇怪的是,如果我在本地拉取并运行映像,它就可以正常工作。

docker run --rm --publish 5000:5000 -e PORT=5000 -it gcr.io/{PROJECT_ID}/{SERVICE_NAME}@sha256:{HASH}
Run Code Online (Sandbox Code Playgroud)

我的 Dockerfile 是最基本的:

FROM ubuntu:20.04

COPY . /app
WORKDIR /app

RUN apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y python3 python3-pip \
    && pip3 install gunicorn Flask flask-cors

CMD exec gunicorn --bind :$PORT --worker-tmp-dir /dev/shm --timeout 900 wsgi:app
Run Code Online (Sandbox Code Playgroud)

更奇怪的是,如果我用 替换基本图像debian:buster-slim,它就可以正常工作。

有谁知道会发生什么?


附加信息:

Cloud Run error: Invalid argument error. Invalid ENTRYPOINT. [name: "gcr.io/{PROJECT_ID}/{SERVICE_NAME}@sha256:{HASH}"
error: "Invalid command \"/bin/sh\": fil
  e not found"
  e not found"
]....failed
Deployment failed
Run Code Online (Sandbox Code Playgroud)

Sha*_*way 4

我遇到了同样的问题。它似乎是间歇性的:白天我无法部署到 Cloud Run,但在晚上,各种解决方法在大约一半的时间里都有效。

我发现的最可靠的解决方法是不依赖 CMD 或 ENTRYPOINT 中的 /bin/sh 或 /bin/bash。/bin/sh 在运行时似乎存在,但有时在部署前 Cloud Run 测试容器时它不存在。

而不是在 Dockerfile 中这样:

CMD exec gunicorn --bind :$PORT --workers 1 --threads 4 main:app
Run Code Online (Sandbox Code Playgroud)

我用这个代替:

CMD ["/usr/bin/python3", "/app/run_gunicorn.py", "--workers", "1", "--threads", "4", "main:app"]
Run Code Online (Sandbox Code Playgroud)

然后我添加了 run_gunicorn.py 脚本:

import os
import sys
from gunicorn.app.wsgiapp import run
port = os.environ['PORT']
sys.argv[-1:-1] = ['--bind', f':{port}']
print("sys.argv:", sys.argv)
run()
Run Code Online (Sandbox Code Playgroud)

这是保持端口号动态的一种方法。