【发布时间】:2019-07-22 14:32:19
【问题描述】:
为什么?
我正在尝试为在 Heroku 上运行 docker-compose 创建一个通用解决方案。我想通过使用 Heroku Button 部署来制作一键式部署解决方案。这样,用户不需要任何 git、Heroku cli 和 docker 知识。
问题。
仅当我将 stack 设置为 container 时,Docker 和 docker 守护程序才可用。有一些构建包可以为您提供 docker 和 docker-compose CLI,但如果没有 docker 守护程序,您将无法运行 docker 映像。所以 buildpacks 不起作用。
将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 守护进程不会运行.....
我尝试在Dockerfile 中定义VOLUME,但问题仍然存在。此外,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 不满意。
【问题讨论】:
-
一年过去了。我仍在寻找解决此问题的方法。
-
您是否尝试通过 SSH 连接到您的守护进程?出于安全原因,我假设无法访问 Heroku 的 docker 守护进程,这就是您在挂载卷时在本地执行的操作。
-
在 VPS 上我可以做得很好。在 Heroku 上我不能。 SSH 到 Heroku 堆栈应用程序有效,但 docker 守护程序没有按照描述中的说明运行。 SSH 到 docker 容器可能有效(没有尝试过),但我看不出如何从容器访问主机。此外,在运行堆栈应用程序时,它受到严重限制(root 不可用和许多其他限制)。我正在寻找一个运行自己的 Docker 守护程序的 Docker 容器。过去有针对它的工作,但它似乎已停止以支持绑定到主机的 docker 守护进程。
-
这不是我所看到的:hub.docker.com/_/docker。我的意思是,当您在 heroku 上部署的容器内时,您确定守护程序没有运行吗?该错误告诉我您无法使用此地址连接到守护程序:
http+docker://localhost。再说一次,如果启用,您可以使用 tcp://0.0.0.0:2375 或端口 2376 或自定义地址吗?将此作为参考:docs.docker.com/engine/reference/commandline/dockerd/… -
我也试过了,但没有出现同样的错误信息。我使用 env var
DOCKER_HOST指定了位置,并尝试了不同的 URL,包括您提到的 URL。我也试过/var/run/docker.sock。如果您能在 Heroku 上使用 DinD 创建一个最小的 hello world 示例,我将不胜感激。
标签: docker heroku docker-in-docker