使用Dockerfile + pipenv + baker时sys.argv丢失了

时间:2018-06-10 08:32:39

标签: python docker dockerfile command-line-arguments pipenv

考虑以下app.py

#!/usr/bin/env python
import baker

@baker.command
def initial_setup(setting1, setting2):
    # do some important prep work here

@baker.command
def start(arg1, arg2):
    # do your thing

if __name__ == '__main__':
    baker.run()

这里我使用baker将我的函数公开为子命令。

我还有一个泊坞文件:

FROM alpine
COPY . /app
WORKDIR /app
ENV SHELL=/bin/ash

RUN apk update && apk upgrade && apk add python3
RUN python3 -m pip install pip --upgrade
RUN python3 -m pip install pipenv

RUN pipenv install
RUN pipenv run ./app.py initial_setup foo bar
CMD pipenv run ./app.py start baz qux

当我运行docker build .时,initial_setup步骤失败并带有

Step ...: RUN pipenv run ./app.py initial_setup foo bar
[...]
No command specified
The command '/bin/sh -c pipenv run ./app.py initial_setup foo bar' returned a non-zero code: 1

当我在命令行中运行pipenv run ./app.py initial_setup foo bar时,它可以工作,但在Dockerfile构建中,似乎sys.argv没有传递给baker。

知道如何说服docker文件将参数传递给我的应用程序吗?

更新

  • 我尝试将initial_setup命令移动到shell脚本中,并使用bash over ash,两者都无济于事。
  • 在我的Dockerfile中添加了一个步骤,以回应@stacksonstacks的评论。

1 个答案:

答案 0 :(得分:0)

事实证明,sys.argv按预期通过,我只能责备我的愚蠢:

我的拼写错误initial_setup,在这种情况下, baker 无法将参数识别为命令,因此错误消息“未指定命令”。