为什么?
我正在尝试创建用于在Heroku上运行docker-compose的通用解决方案。我想通过使用Heroku Button部署制作一键式部署解决方案。这样,用户不需要git,Heroku cli和docker的任何知识。
问题。
仅当我将stack
设置为container
时,Docker和docker守护程序才可用。有一些构建包可为您提供docker和docker-compose CLI,但没有docker守护程序,您将无法运行docker映像。因此,构建包将无法工作。
在stack
设置为container
的情况下,我可以使用文件heroku.yml
(article)。在其中定义我的流程。 (它代替了Procfile
。如果我仍然向项目中添加Procfile
,它将什么都不做。)
我还可以在那里定义Dockerfile
来构建我的docker映像。
但是,当我运行docker映像时,会弹出以下错误:
2019-02-28T15:32:48.462101+00:00 app[worker.1]: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
2019-02-28T15:32:48.462119+00:00 app[worker.1]:
2019-02-28T15:32:48.462122+00:00 app[worker.1]: If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
问题出在Docker容器内部,Docker守护进程未运行。解决方案是将其安装:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
而且由于您无法使用Procfile
,所以我无法运行该命令。 (请参见上文heroku.yml
替换为Procfile
。)如果我使用的是buildpack,我可以使用Procfile
,但docker守护程序将无法运行.....
我尝试在VOLUME
中定义一个Dockerfile
,问题仍然存在。此外,一篇heroku文章说"Volume mounting is not supported. The filesystem of the dyno is ephemeral."
在Heroku上可以运行docker映像。我正在努力的是在docker映像中运行docker。
通过安装/var/run/docker.sock
在我的VPS上以docker镜像运行docker可以正常工作,但这不能在Heroku上完成。
最后一句话: 我正在尝试使其工作,以便其他人即使不熟悉git,heroku cli和docker也可以轻松部署软件解决方案。
答案 0 :(得分:1)
不幸的是,您的问题的答案是:还没有。
出于安全考虑,Heroku不向用户提供运行特权容器的功能,因为容器可以访问主机功能。
文档非常清楚您的limitations,例如:没有--priviledged
容器,也没有root
用户,也没有VOLUMES
并且磁盘是临时的。
在处理完您关注的DinD图像后,我得出的结论是,尝试在Heroku容器中运行Docker不是正确的选择和设计。 我很确定您要实现的目标与Heroku为用户提供的目标接近。提供非开发人员仅需一个按钮即可推送和部署应用程序的平台或应用程序,可能会以各种方式引起人们的兴趣。可以使用其平台API的应用程序来完成。 在这种情况下(据我所知),Web应用程序(在Heroku上运行)可能无法执行您想要的操作。相反,您需要嵌入一个桌面应用程序:git,docker和您的应用程序,以解析,验证,构建并将应用程序/组件推送到Heroku的容器注册表中。
最后,如果您仍然认为需要DinD解决方案,那么,使用VPS的主要解决方案是目前唯一的解决方案。但是请注意,它可能会给您的系统带来安全漏洞,并且当您试图限制这些安全门时,您可能会提供与Heroku的产品类似的产品。
答案 1 :(得分:0)
我所做的就是像这样在dockerfile中安装它:
RUN curl -fsSLO https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz \
&& tar xzvf docker-17.04.0-ce.tgz \
&& mv docker/docker /usr/local/bin \
&& rm -r docker docker-17.04.0-ce.tgz
然后在用于运行docker的args部分中,我添加了以下内容:
args '--user root -v /var/run/docker.sock:/var/run/docker.sock'
有关为何有效的更多说明,请参见:stackoverflow.com/q/27879713/354577但这对我来说很好。
答案 2 :(得分:0)
我认为您不能在Heroku上运行可以使用docker命令启动某些Docker容器的服务。
我想通过使用Heroku Button部署制作一键式部署解决方案。
我认为您可以将Deploy按钮的引用更新到您的某些自动化服务器(例如:一个实例Jenkins已经部署在Heroku /另一个云上)来触发部署管道,并且不允许人们与git / docker交互等
但是,是的,您必须处理很多问题,例如安全性,参数。当不使用流行的解决方案(如Jenkins / CircleCI登录)然后进行部署时...