【发布时间】: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