Google cloud platform 谷歌云运行错误:无效命令\“/bin/sh\";:从Docker映像部署时未找到文件
我正在尝试在Google Cloud上部署一个相当简单的Python web应用程序,该应用程序使用FastAPI和Gunicorn,并使用Docker容器运行。在部署后,我不断遇到相同的错误:Google cloud platform 谷歌云运行错误:无效命令\“/bin/sh\";:从Docker映像部署时未找到文件,google-cloud-platform,fastapi,google-cloud-run,Google Cloud Platform,Fastapi,Google Cloud Run,我正在尝试在Google Cloud上部署一个相当简单的Python web应用程序,该应用程序使用FastAPI和Gunicorn,并使用Docker容器运行。在部署后,我不断遇到相同的错误: Invalid ENTRYPOINT. [name: "gcr.io/<project_id>/<image_name>@sha256:xxx" error: "Invalid command \"/bin/sh\": file
Invalid ENTRYPOINT. [name: "gcr.io/<project_id>/<image_name>@sha256:xxx" error: "Invalid command \"/bin/sh\": file not found" ].
cloudbuild.yaml
步骤:
-名称:gcr.io/cloud-builders/docker
参数:[“build”、“--build arg”、“SETTINGS\u MODULE=app.SETTINGS\u production”、“-t”、“gcr.io/$PROJECT\u ID/”、“]
图像:
-gcr.io/$PROJECT\U ID/
gcloud builds submit--config=cloudbuild.yaml
更新
我用debian:buster-slim
替换了ubuntu:latest
(==20.04
),它成功了
以前
部署到云运行时,我也收到了错误…我怀疑是端口
,正在调查。不是端口
。奇怪的是,图像在本地运行。尝试一个不同的操作系统
我在一个项目中重新创建了您的Dockerfile
和cloudbuild.yaml
,构建和运行成功:
docker运行\
--交互式--tty\
--环境=端口=8888\
gcr.io/${PROJECT}/67486954
[2021-05-11 16:09:44+0000][1][INFO]启动gunicorn 20.1.0
[2021-05-11 16:09:44+0000][1][INFO]收听地址:http://0.0.0.0:8888 (1)
注意要从Dockerfile
生成,您不需要创建cloudbuild.yaml
,只需gcloud builds submit——标记gcr.io/PROJECT\u ID/…
诊断问题的一个好方法是在本地运行docker build
:
docker构建\
--build arg=SETTINGS\u MODULE=app.SETTINGS\u production\
--tag=gcr.io/$PROJECT\u ID/\
.
然后尝试运行它:
docker运行\
--交互式--tty--rm\
gcr.io/$PROJECT\U ID/
这将云构建隔离为问题,并可能导致相同的错误
错误表明容器没有在ubuntu:latest
图像中找到shell(/bin/sh
),这很奇怪
我想你可以|应该在'CMD'之后去掉'exec'`
注意我通读了谷歌的教程,看到其中的说明包括CMD exec…
,我不清楚为什么这是必要的,但大概这不是问题
您能否在本地运行gunicorn
命令而不出现问题
/usr/local/bin/gunicorn-b:$PORT-w 4-k uvicorn.workers.UvicornWorker app.main:app--chdir/code
--chdir/code
的位置也很奇怪。那么:
WORKDIR code
COPY . .
...
CMD /usr/local/bin/gunicorn -b :$PORT -w 4 -k uvicorn.workers.UvicornWorker app.main:app
Hmmm可能会将--chdir
移动到app.main:app
之前,使其应用于gunicorn
而不是您的应用程序
/usr/local/bin/gunicorn-b:$PORT-w 4-k uvicorn.workers.UvicornWorker--chdir/code-app.main:app
我使用
cloudbuild.yaml
的唯一原因是,我无法找到将--build arg
命令传递给映像构建的另一种方法。我试图用debian:buster slim
替换ubuntu:latest
,构建成功,但是web应用的URL给了我一个服务不可用
,所以我想现在的问题可能是端口和/或db连接问题。我将图像推到容器注册表,并将其拉出来,然后尝试使用它运行docker run--rm--name gcr nobg container-p 80:8080--env file.env gcr.io/$PROJECT_ID/
,图像中的命令是CMD exec gunicorn-b:$PORT-w 4-k uvicorn.workers.UvicornWorker-app.main:app
,其中$PORT
是云端运行时自动生成的env变量,一切正常。但它在云运行中不起作用。我得到相同的错误:“无效命令\”/bin/bash\“:未找到文件”
。我在这里遗漏了什么?没有更多的信息,我不可能回答。你确信你使用的是基于Debian而不是麻烦的Ubuntu基础的图像吗?您使用的是什么云运行部署命令?也许可以创建一个新问题并发布详细信息,包括您的gcloud run deploy
命令?我使用了原始问题(gcloud builds submit…
)中的所有内容,但按照您的建议,用debian替换了ubuntu映像。DazWilkin,我接受了您的答案,因为您的解决方案解决了我的大部分问题。非常感谢。
WORKDIR code
COPY . .
...
CMD /usr/local/bin/gunicorn -b :$PORT -w 4 -k uvicorn.workers.UvicornWorker app.main:app