Dockerfile中的Luigi Pipeline;未知指令PYTHONPATH

时间:2019-01-04 19:25:43

标签: python-3.x docker dockerfile luigi

我有这个Dockerfile:

FROM python:3.7
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD [
'PYTHONPATH="."', 'luigi', '--module', 'pipe',
'CreateAndFillIndex',
'--index', 'test',
'--http-auth', 'username:password',
'--host', 'localhost',
'--port', '9200'
 ]

使用此Dockerfile执行docker build -t suggestpipe . && docker run -it suggestpipe 时出现错误:

unknown instruction: "PYTHONPATH='.'",

如果我删除了该指令,我会得到unknown instruction: "LUIGI",,那么我在做什么错了?

在requirements.txt中,有luigi依赖项。还有“ PYTHONPATH =”。需要在Mac上的Docker外部本地运行,因此我也将CMD指令也移到了Dockerfile中,但是我不确定是否需要它。如何运行管道?

3 个答案:

答案 0 :(得分:2)

Dockerfile语法实际上不是JSON,并且在[之后不能有换行符。 Docker实际上将其重写为

CMD ["/bin/sh", "-c", "["]

(实际上是有效的!您可能有一个/bin/[二进制文件!但是容器将立即以状态代码0退出。)

然后继续下一行

"PYTHONPATH='.'", "luigi", "--module", "pipe",

由于实际上看起来并不像Dockerfile指令而感到困惑。

仅删除该换行符只会使您分心。如果您运行

CMD ["PYTHONPATH='.'", "luigi", ...]

Docker不会启动shell来尝试运行它;相反,它将在通常的目录中查找一个完全命名为PYTHONPATH='.'的二进制文件,当找不到例如 /usr/bin/PYTHONPATH='.'时,它将抱怨。

您根本不需要设置此环境变量(特别是因为pip install步骤会将软件包安装到映像的隔离全局Python安装中),而我只是将其删除:

CMD ["luigi", ...]

如果要做需要设置,则需要使用显式的ENV指令

ENV PYTHONPATH .

答案 1 :(得分:1)

这是由于您提供CMD指令的方式。您当前正在使用exec表单,但是您依赖于shell行为。有关详细信息,请参见Dockerfile documentation on the CMD instruction

解决方法是将其转换为shell格式,如下所示:

CMD PYTHONPATH='.' luigi --module pipe CreateAndFillIndex --index test --http-auth username:password --host localhost --port 9200

或者,您可以使用ENV指令(documentation)设置环境变量

ENV PYTHONPATH=.
CMD [ "luigi", "--module", "pipe", 'CreateAndFillIndex', '--index', 'test', '--http-auth', 'username:password', '--host', 'localhost', '--port', '9200' ]

答案 2 :(得分:0)

错误非常明显: 未知指令:“'PYTHONPATH ='。'”,

您已在PYTHONPATH =之前和之后添加了不必要的刻度('),这在shell术语中被视为捕获的命令输出。删除不必要的刻度,它应该起作用。