将一个Python脚本放入Docker容器中

10

我正在尝试将一个已存在的Python函数放入Docker容器中。这个Python代码会读取一个CSV文件(该文件与dockerfile在同一目录下)作为输入数据,并进行一些计算。Python文件的名称为"PracticeDeploy.py",其代码如下:

import pandas as pd
import pickle
from OptimizationFunction import main_barrel

# Read in model
gbrModel = pickle.load(open('/src/ValDiffGBR.pkl', 'rb'))
file_name = str(input())
data=pd.read_csv('/src/'+file_name)
new_data = data.dropna(how='any')
preds = main_barrel(gbrModel, new_data)

在我的docker目录中,我已经有一个子文件夹,其中包含了我第一个dockerfile安装的所有库。此外,在我的目录中,我有py文件、CSV和模型,我在上面的py文件中导入。现在,我正在尝试构建另一个dockerfile,该文件将以CSV名称作为输入,然后运行python代码。

以下是dockerfile:

FROM [my repository] as builder
ARG DATA_FILE

RUN mkdir src
WORKDIR /src
COPY . /src

ENTRYPOINT ["PracticeDeploy.py"]

我这样构建:

我这样构建:

sudo docker build --rm -f Dockerfile -t "first_docker" --build-arg DATA_FILE='/src/[csv_name].csv' .

我尝试这样运行:

我尝试这样运行:

sudo docker run --rm first_docker

然而我遇到了这个错误:
docker: Error response from daemon: OCI runtime create 
failed: container_linux.go:348: starting container process 
caused "exec: \"PracticeDeploy.py\": executable file not 
found in $PATH": unknown.

我在运行docker时应该只插入参数吗?我的做法正确吗?我对docker非常陌生,完全被卡住了。


ENTRYPOINT ["./PracticeDeploy.py"] 应该可以工作。 - Ken Y-N
1
尝试将“python”添加到您的Entrypoint中。您的PracticeDeploy.py既不可执行,也没有#!/usr/bin/env python - The Pjot
有人在这里成功地使用CMD而不是ENTRYPOINT来运行Python文件:https://dev59.com/rVsV5IYBdhLWcg3wzBg7。这里有一篇关于如何将Python容器化的博客,他们也使用CMD:https://runnable.com/docker/python/dockerize-your-python-application。 - Rorschach
1个回答

19

CMD 解决方案

我建议从 Entrypoint 切换到 CMD。

CMD [ "python", "./my_script.py" ]

这种方法的详细步骤可以在此处了解:https://runnable.com/docker/python/dockerize-your-python-application

还可以使用CMD来处理更多复杂性(标志等),具体信息可以在此处查看:如何将命令行参数传递给在docker中运行的python脚本

ENTRYPOINT 解决方案

ENTRYPOINT ["python", "app.py"]

这种解决方案在这里有详细解释:

https://lostechies.com/gabrielschenker/2016/08/21/container-entrypoint/

如果你好奇并不知道的话:

CMD命令可以从命令行覆盖。 CMD 实际上是容器命令的默认值。

ENTRYPOINT 命令不能从命令行上被覆盖。

CMDENTRYPOINT 类似,但我更喜欢使用 command,因为它使我能够在运行时更改标志或命令(如果需要),同时保持相同的 dockerfile,以便无需命令即可运行。

以下是更详细的讨论: http://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接