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' ]
我有这个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' ]