Dockerfile 中的 Luigi 管道;未知指令 PYTHONPATH

Luigi Pipeline in Dockerfile; unknown instruction PYTHONPATH

我有这个Docker文件:

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'
 ]

用这个 Docker 文件执行 docker build -t suggestpipe . && docker run -it suggestpipe 我收到错误:

unknown instruction: "PYTHONPATH='.'",

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

在 requirements.txt 中有一个 luigi 依赖项。还有 'PYTHONPATH='。在我的 Mac 上 Docker 之外的本地需要 运行ning,所以我将该 CMD 指令也移到了 Docker 文件中,但我不确定是否需要它.我如何 运行 我的管道?

错误很明显: 未知指令:“'PYTHONPATH='.'”,

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

Docker 文件语法实际上不是 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 .

这是由于您提供 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' ]