问题涉及 WSL、Gunicorn、Docker 和 Flask

The problem involved WSL, Gunicorn, Docker and Flask

我正在开发 Windows 10 Pro,Git Bash,Docker Desktop。

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

Docker文件中的入口点:

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

如果我是对的,它与 Windows 中没有的 gunicorn 有关。

谷歌搜索后,wsl 似乎是一个选项。其实有wsl(已经开启,运行ning在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)

Docker文件:

FROM python:stretch

COPY . /app
WORKDIR /app

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

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

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

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


除此之外:如果您获得容器 运行,则可能无法到达您的 API。在这种情况下,将 ENTRYPOINT.

中的 gunicorn 绑定更改为 "0.0.0.0:8080"