我在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
也可以运行。
这里发生了什么?
Damien MATHIEU:我尝试运行的图像是https://github.com/jshimko/meteor-launchpad - 我的docker文件是:
FROM jshimko/meteor-launchpad:latest
CMD ["node", "main.js"]
答案 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