Docker容器在本地运行但在Cloud Run上失败

4

我把项目从PIP迁移到Poetry,但我的Docker容器在Google Cloud Run上无法运行。

Docker中的最后一个字符串:

CMD ["poetry", "run", "uwsgi", "--http-socket", "0.0.0.0:80", "--wsgi-file", "/server/app/main.py", "--callable", "app", "-b 65535"]

它在本地工作,在其他笔记本电脑上工作,在Cloud Run Emulator上工作,但是当我尝试在Cloud Run上运行时失败了。

这是一个Cloud Run的日志:

Creating virtualenv my-project-xTUGyw3C-py3.8 in /home/.cache/pypoetry/virtualenvs

FileNotFoundError

[Errno 2] No such file or directory: b'/bin/uwsgi'

at /usr/local/lib/python3.8/os.py:601 in _execvpe
597│ path_list = map(fsencode, path_list)
598for dir in path_list:
599│ fullname = path.join(dir, file)
600try:
→ 601│ exec_func(fullname, *argrest)
602except (FileNotFoundError, NotADirectoryError) as e:
603│ last_exc = e
604except OSError as e:
605│ last_exc = e
Container called exit(1).

已经正确设置了端口,没有使用任何环境变量。我没有使用容器卷,也没有通过COPY将文件传递给Docker。

日志显示应用程序找不到uwsgi文件。本地版本中也不存在该文件,但是它可以正常运行而没有任何错误。

这个Docker容器如何可能表现出不同的行为?

更新:我的Docker文件

FROM python:3.8
WORKDIR server
ENV PYTHONPATH $PYTHONPATH:/server
RUN pip install poetry==1.1.11
COPY poetry.lock /server
COPY pyproject.toml /server
RUN poetry install
EXPOSE 80
COPY /data /server/data
COPY /test /server/test
COPY /app /server/app
CMD ["poetry", "run", "uwsgi", "--http-socket", "0.0.0.0:80", "--wsgi-file", "/server/app/main.py", "--callable", "app", "-b 65535"]

1
可能会有帮助,发布您的Dockerfile。并确保其中没有凭据... - Gabe Weiss
错误是 **没有这样的文件或目录:b'/bin/uwsgi'**。编辑您的问题并包括构建/部署命令和Dockerfile。展示您如何设置WSGI服务器。 - John Hanley
我认为OP有理由质疑为什么一个容器可以在某个地方运行,但在Cloud Run上却不能。当然,这里存在一些差异:Linux内核和/或实现(shim)到Linux系统调用的差异、容器运行时等。我想知道Cloud Run运行时是否过于限制(或错误)。错误出现在Python的os.py文件中(链接),代码似乎在路径中循环查找uwsgi二进制文件。由于某种原因,在Cloud Run上的行为不同。 - DazWilkin
没关系,因为我在Cloud Run中设置了端口80。我使用标准的docker build . -t <image-tag>构建,然后将其推送到gcr.io,并将图像链接粘贴到cloud run中。 - Andrei Krasnikau
我不知道为什么,但如果我使用pip安装所有内容而不是poetry,一切都可以正常工作。 - Andrei Krasnikau
显示剩余7条评论
1个回答

1

HOME=/root 添加到 CMD 中,对我来说解决了问题。

CMD HOME=/root poetry run python main.py

显然,home路径设置不正确,这是一个已知问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接