带有参数的docker container`heroku run`命令返回"未找到"

时间:2017-10-20 14:02:18

标签: docker heroku

我在heroku上运行一个docker容器,但我似乎无法理解它是如何工作的。

在本地我可以运行命令docker run imageName ls -al,但在heroku上:heroku run "ls -al"它会返回./entrypoint.sh: line 34: exec: ls -al: not found。虽然我在没有参数的情况下运行heroku run ls,但它按预期工作。 (另一个实验我已经heroku run bash,然后./entrypoint.sh ls -al也可以运行。

这里发生了什么?

评论更新:

2 个答案:

答案 0 :(得分:1)

编辑-2 - 2017年10月28日

Heroku的最新更新

  

我们对此进行了分类,我们绝对不会在这里实现与Docker兼容的行为。感谢您抓住这一点 - 我们会解决这个问题。

原始回答

你的错误从下面很明显

./entrypoint.sh: line 34: exec: ls -al: not found

您将ls -al作为一个字符串参数传递。你应该尝试下面的

heroku run -- ls -al

修改-1

所以我创建了一个简单的Dockerfile来测试这个问题。

FROM alpine
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["tail", "-f", "/dev/null"]

entrypoint.sh

#!/bin/sh
echo "You passed $# arguments"
for var in "$@"
do
    echo "$var"
done

exec "$@"

当我在本地构建并运行容器时,我得到输出为

$ docker run -it 5e866a76fd25
You passed 3 arguments
tail
-f
/dev/null

当我将应用程序推送到Heroku时,我的日志输出低于输出

2017-10-21T19:11:11.873567+00:00 app[api]: Deployed web (xxxxx) by user xxx@yyy.com
2017-10-21T19:11:14.235819+00:00 heroku[web.1]: Starting process with command `tail -f /dev/null`
2017-10-21T19:11:16.593724+00:00 heroku[web.1]: Process exited with status 127
2017-10-21T19:11:16.447960+00:00 app[web.1]: You passed 1 arguments
2017-10-21T19:11:16.447976+00:00 app[web.1]: tail -f /dev/null

这是完全错误的,因为CMD被作为单个参数而不是3个参数发送。我已经和heroku团队一起开了一张票,希望他们会在Tue之前回复

答案 1 :(得分:1)

我也遇到了这个问题。作为临时解决方法,我将原始CMD放入单独的脚本文件中,现在在CMD中调用该脚本文件。

这是我原来的Dockerfile

...
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]

这是我的 Dockerfile

...
RUN chmod +x PATH_TO_START_SCRIPT/start.sh
CMD ["./start.sh"]

我的start.sh脚本(启动Rails应用程序):

#!/bin/bash

set -e

echo "Starting Puma server..."

bundle exec puma -C config/puma.rb