代码之家  ›  专栏  ›  技术社区  ›  Phil

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

  •  1
  • Phil  · 技术社区  · 7 年前

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

    执行 docker build -t suggestpipe . && docker run -it suggestpipe 通过这个dockerfile,我得到了错误:

    unknown instruction: "PYTHONPATH='.'",

    如果我取消这个指令,我会 unknown instruction: "LUIGI", 我做错了什么?

    在requirements.txt中有一个Luigi依赖项。“pythonpath='.'是在Mac上在Docker外部本地运行所必需的,因此我也将该命令移到了Dockerfile中,但我不确定是否需要它。”如何运行管道?

    3 回复  |  直到 7 年前
        1
  •  2
  •   David Maze    7 年前

    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 .
    
        2
  •  1
  •   Marcus    7 年前

    这是由于您提供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' ]
    
        3
  •  0
  •   Alberto    7 年前

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

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