【问题标题】:The problem involved WSL, Gunicorn, Docker and Flask问题涉及 WSL、Gunicorn、Docker 和 Flask
【发布时间】:2021-03-01 13:56:13
【问题描述】:

我正在使用 Windows 10 Pro、Git Bash、Docker Desktop。

现在我有一个项目,它通过 Gunicorn 在 Docker 中运行 Flask 应用程序。

Dockerfile 中的入口点:

ENTRYPOINT ["gunicorn", "-b",":8080","main.py"]

当运行以下命令时:

 docker run -p 127.0.0.1:80:8080 jwt-api-test

显示错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 358, in import_app
    mod = importlib.import_module(module)
  File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 962, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'main.py'; 'main' is not a package

如果我是对的,它与 gunicorn 有关,在 Windows 中不可用。

谷歌搜索后,似乎 wsl 是一个选项。其实有wsl(已经开启,在Docker Desktop中运行),信息如下:

wsl.exe --list --all --verbose
  NAME                   STATE           VERSION
* docker-desktop-data    Running         2
  docker-desktop         Running         2

当我单击 wsl.exe 并尝试打开 bash 时,它不起作用:没有错误,只是什么也没发生。我确实根据一些说明使用了 shift +restart,但它也不起作用。

我可以就如何使这个 Flask 应用程序正常工作寻求您的帮助吗?谢谢。

编辑:main.py的结构:

JWT_SECRET = os.environ.get('JWT_SECRET', 'abc123abc1234')
LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO')

LOG = _logger()
LOG.debug("Starting with log level: %s" % LOG_LEVEL )
APP = Flask(__name__)

if __name__ == '__main__':
    APP.run(host='127.0.0.1', port=8080, debug=True)

Dockerfile:

FROM python:stretch

COPY . /app
WORKDIR /app

RUN pip install --upgrade pip
RUN pip install -r requirements.txt

ENTRYPOINT ["gunicorn", "-b", ":8080", "main.py"]

【问题讨论】:

  • 如何在main.py 中运行烧瓶?
  • @Raf_W-O,我在原帖中添加了main.py的结构。是你的意思吗?
  • 仅关于 WSL 子问题 - 虽然 Docker 有一个 WSL,但它是 Docker 用于其功能的“私有”实例。您可以从 Microsoft Store 安装“用户”实例 - 有 Ubuntu WSL、Kali WSL、Debian WSL 和 Alpine(在最受支持的选项中)。我可能会推荐一个股票 Ubuntu 20.04 安装。也就是说,我不太确定这是让 Docker gunicorn 运行所需要的。我认为它可以在 Docker 容器中按原样工作,因为它通过 WSL 使用真正的 Linux 内核。
  • @NotTheDr01ds,感谢您的推荐。如果我稍后尝试,我会提供反馈。

标签: python docker flask gunicorn windows-subsystem-for-linux


【解决方案1】:

假设您的其余设置正确(相对路径、端口、Dockerfile 等),问题可能是将main.py 传递给gunicorn

通常您需要传递您的 Flask 变量,即在您的情况下,将 ENTRYPOINT 中的 "main.py" 替换为 "main.APP"(参见 docs


除此之外:如果您让容器运行,则可能无法访问您的 API。在这种情况下,将您的 gunicorn 绑定更改为您的 ENTRYPOINT 中的 "0.0.0.0:8080"

【讨论】:

  • 我已经在我的原始帖子中添加了 Dockerfile。 Gunicorn 不能在 Windows 上运行,必须使用 Linux 系统。
  • 由于您在 Docker 容器内部运行 Gunicorn,因此无论您是否在 Windows 上都无关紧要。请务必使用 Linux 容器。
  • 谢谢。我刚刚搜索了如何确保 docker 容器是否是 Linux 容器,但没有得到一个非常明确的答案。请问如何确保Docker容器是Linux或者它已经是Linux容器或者如果可能的话如何检查它。
  • 默认使用 Linux 容器。要检查(或切换)容器类型,请右键单击系统托盘中的泊坞窗图标(请参阅here)。您应该会看到一个选项“切换到 Windows 容器”;那么你很好。否则,请单击“切换到 Linux 容器”。
猜你喜欢
  • 2016-11-20
  • 2014-09-14
  • 2018-02-25
  • 2023-02-16
  • 1970-01-01
  • 2021-12-29
  • 2022-10-23
  • 2016-03-02
  • 2021-04-29
相关资源
最近更新 更多