问题涉及 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"
我正在开发 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
.
"0.0.0.0:8080"