10

为什么?
我正在尝试为在 Heroku 上运行 docker-compose 创建一个通用解决方案。我想通过使用 Heroku Button 部署来制作一键式部署解决方案。这样,用户不需要任何关于 git、Heroku cli 和 docker 的知识。

问题。
Docker 和 docker 守护进程仅在我设置stackcontainer. 有一些构建包可以为您提供 docker 和 docker-compose CLI,但如果没有 docker 守护程序,您将无法运行 docker 映像。所以buildpacks不会工作。设置为我可以使用文件
(文章。在那里我定义了我的流程。(它取代了。如果我仍然将 a 添加到我的项目中,它将什么都不做。) 我还可以在那里定义一个来构建我的 docker 映像。 但是,当我运行 docker 映像时,会弹出以下错误: stackcontainerheroku.ymlProcfileProcfile
Dockerfile

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 文章说“不支持卷安装。dyno 的文件系统是短暂的。”

在 Heroku 上可以运行 docker 镜像。我正在努力的是在 docker 映像中运行一个 docker。
通过挂载在 docker 映像中运行 docker 在我的 VPS 上运行良好,/var/run/docker.sock但这不能(?)在 Heroku 上完成。

最后一句话:我正在努力使这项工作成为可能,以便其他人可以轻松地部署软件解决方案,即使他们不熟悉 git、heroku cli 和 docker。

4

3 回答 3

2

不幸的是,您的问题的答案是:还没有。

出于安全原因,Heroku 不向用户提供运行特权容器的能力,因为容器可以访问主机功能。该文档非常清楚您的限制,例如:没有--priviledged容器也没有root用户,没有VOLUMES并且磁盘是短暂的。

在为您考虑过使用 DinD 映像后,我得出的结论是,尝试在 Heroku 容器中运行 Docker 不是正确的选择和设计。我很确定您要实现的目标与 Heroku 向用户提供的目标很接近。提供一个平台或应用程序,非开发人员只需一个按钮即可推送和部署应用程序,这可能会以各种方式非常有趣。它可以通过使用他们的平台 API 的应用程序来完成。在这种情况下,Web 应用程序(在 Heroku 上运行)可能(据我所知)无法执行您想要的操作。相反,您需要嵌入桌面应用程序:git、docker 和您的应用程序,用于解析、验证、构建和推送您的应用程序/组件到 Heroku 的容器注册表。

最后,如果您仍然认为您需要 DinD 解决方案,那么使用 VPS 的主要解决方案是目前唯一的解决方案。但请注意,它可能会为您的系统打开安全漏洞,并且在尝试限制这些安全门时,您可能会提供类似于 Heroku 的报价。

于 2020-11-14T13:27:20.520 回答
0

我认为您不能在 Heroku 上运行可以使用 docker 命令启动一些 docker 容器的服务。

我想通过使用 Heroku Button 部署来制作一键式部署解决方案。

我认为您可以将部署按钮的引用更新到您的一些自动化服务器(例如:Jenkins 已经部署在 Heroku/另一个云上的实例)以触发部署管道并且不要让人们与 git/docker 等交互。
但是,是的,您必须处理很多问题,例如安全性、参数。当不使用 Jenkins/CircleCI 等流行解决方案登录然后部署时...

于 2020-11-12T04:51:46.123 回答
-1

我所做的是将它安装在我的 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不过,这对我来说效果很好。

于 2019-02-28T16:46:10.820 回答