【问题标题】:How to build non-web python application image with buildpack?如何使用 buildpack 构建非 web python 应用程序映像?
【发布时间】:2021-04-25 14:08:35
【问题描述】:
我是容器新手,下面的问题可能听起来很愚蠢。
其实有两个问题。
-
我有一个非 web python 应用程序在 VScode 中经过全面测试,没有任何错误,然后我使用下面的 Dockerfile 在本地构建它。
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "./mycode.py"]
图像已成功构建,但运行以 TypeError 结束。我已确保 requirements.txt 与我的项目环境具有相同的依赖关系。错误消息是“错误的元组索引”,这让我不知道问题可能来自完全测试的代码。我被一种奇怪的感觉困在这里。
- 然后我尝试使用 Procfile 构建包:
worker: python mycode.py
映像已成功构建,但 docker run 无法启动应用程序并出现以下错误。我不知道除了“worker:”之外还有什么可以在 Procfile 中启动非 Web python 应用程序。又卡住了!
错误:启动失败:确定启动命令:当没有
默认进程一个命令是必需的
我搜索过,但都是关于 Procfile 中带有“web:”的 Web 应用程序。任何一个问题的帮助将不胜感激。
【问题讨论】:
标签:
python
docker
buildpack
non-web
【解决方案1】:
当您启动容器时,您需要将worker 进程类型传递给它,如下所示:
$ docker run -it myapp worker
然后它应该运行你添加到Procfile的命令。
其他一些事情:
- 确保您使用的是
heroku/python buildpack 或其他包含 Procfile 检测的 buildpack。
- 在构建输出中确认
worker 进程类型已创建
- 如果您不想将
worker 添加到启动命令中,您可以将您的命令设置为web: 进程类型。运行 Web 应用的 web: 进程没有任何问题
【解决方案2】:
感谢@codefinger 的提醒。经过多次试验,我终于使用以下命令启动了我的应用程序:
docker run -it --name container_name image_name python mycode.py
其实 docker run 命令的格式如下:
docker run [options] image [command] [arg..]
我怀疑即使 buildpack 映像也没有工作进程,仍然可以使用“命令”选项来启动您的应用程序。
但是,成功运行由 buildpack 构建的映像而没有任何错误让我感觉越来越奇怪。
相同的代码和相同的 requirements.txt 文件,没有任何改变!为什么 docker build 构建的图像会给我一个 TypeError?好诡异。