我正试图在Heroku上部署jenkinsi/docker,但在编写Dockerfile时遇到了问题。
当我通过heroku container:push web
在Heroku Container Registry上推送Docker映像时,我得到了一个错误Your Docker image must specify a 'CMD' instruction
。
但是我必须写什么命令才能在Heroku上的容器中运行Jenkins?
提前感谢!
错误是指Dockerfile
中缺少CMD
节。
但是,如果您不打算修改jenkins
图像上游版本中的任何内容(如您提供给Dockerfile
的链接所示),则不需要创建自己的docker图像和Dockerfile
。
您可以只在本地使用docker pull jenkins/jenkins:lts
,然后使用docker tag jenkins/jenkins:lts registry.heroku.com/<app>/<process-type>
对其进行标记,然后使用新标记docker push registry.heroku.com/<app>/<process-type>
将其推送到Heroku
您可以在Heroku的官方文档中阅读更多关于此主题的内容。
编辑:
例如,如果你确实需要一个自定义的jenkins docker镜像来安装额外的jenkins插件(就像OP需要的那样),你最终会创建自己的Dockerfile
,你必须这样做:
FROM jenkins/jenkins:lts
RUN /usr/local/bin/install-plugins.sh gitlab-plugin publish-over-dropbox
CMD ["--debug=5"]
虽然我们在正常环境中不需要它,但我们添加了一个CMD
节,只是为了通过heroku container:push
检查,该检查需要Dockerfile
中的CMD
节,--debug=5
由jenkins.sh
ENTRYPOINT
脚本检测并发送到jenkins.war
程序,从而将调试级别设置为5(如果未指定,则为默认级别),这反过来对我们没有任何影响。
编辑#2:
因为heroku不接受ENTRYPOINT
的多个指令,所以您必须进一步偏离正常的Dockerfile
场景,并通过将ENTRYPOINT
上游节设置为[]
来取消它,因为它与heroku兼容,然后将所有内容都放在CMD
节中:
FROM jenkins/jenkins:lts
RUN /usr/local/bin/install-plugins.sh gitlab-plugin publish-over-dropbox
ENV JAVA_OPTS -Xms256m -Xmx512m
ENTRYPOINT []
CMD /bin/tini -s -- /usr/local/bin/jenkins.sh --httpPort=$PORT
我在coupe中添加了JAVA_OPTS
,并提供了一个免费的dyno层,因为jenkins和java都是需要内存的应用程序,可以根据需要进行调整。
我在tini
中添加了-s
标志,因为它不再有PID 1
,这里有更多内容。
我添加了发送到jenkins.war
的--httpPort=$PORT
标志,这样heroku就可以为应用程序填充正确的$PORT
。
heroku文档注释:
ENTRYPOINT是可选的。如果未设置,将使用/bin/sh-c
现在我在Heroku上部署jenkinsi/docker时遇到了另一个问题:
2017-10-27T15:53:37.569477+00:0 heroku[web.1]:状态从崩溃变为启动
2017-10-27T15:53:35.856897+00:0 app[api]:用户部署的web(dce6a8335a9a)roman.skaskevich@gmail.com
2017-10-27T15:53:35.856897+00:0 app[api]:用户创建的v7版本发布roman.skaskevich@gmail.com
2017-10-27T15:53:53.949433+00:0 heroku[web.1]:使用命令"--debug\=5"启动进程
2017-10-27T15:53:56.142034+00:0 app[web.1]:错误:没有这样的文件或目录
2017-10-27T15:53:56.243216+00:0 heroku[web.1]:状态从启动更改为崩溃
2017-10-27T15:53:56.228817+00:0 heroku[web.1]:进程退出,状态为126