我如何 运行 Docker in Docker on Heroku?
How do I run Docker in Docker on Heroku?
为什么?
我正在尝试为 Heroku 上的 运行ning docker-compose 创建一个通用解决方案。我想通过使用 Heroku Button 部署来制作一键式部署解决方案。这样,用户不需要任何 git、Heroku cli 和 docker.
的知识
问题。
Docker 和 docker 守护程序仅在我将 stack
设置为 container
时可用。有一些构建包可以为您提供 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 守护进程不是 运行ning。解决方法是挂载它:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
并且由于您不能使用 Procfile
我不能 运行 该命令。 (见上文 heroku.yml
替换 Procfile
。)如果我使用的是构建包,我可以使用 Procfile
但 docker 守护进程不会 运行ning。 ....
我尝试在 Dockerfile
中定义一个 VOLUME
,但问题仍然存在。此外,一篇 heroku 文章说 "Volume mounting is not supported. The filesystem of the dyno is ephemeral."
在 Heroku 上,可以 运行 一个 docker 图像。我正在努力的是 运行 在 docker 图像中设置 docker。
运行 docker 图像中的 docker 通过安装 /var/run/docker.sock
在我的 VPS 上工作正常,但这不能(?)在 Heroku 上完成。
遗言:
我正在努力使这项工作有效,以便其他人即使不熟悉 git、heroku cli 和 docker 也可以轻松部署软件解决方案。
我所做的是将它安装在我的 docker 文件中,如下所示:
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 '--user root -v /var/run/docker.sock:/var/run/docker.sock'
有关此方法为何有效的进一步解释,请参阅: 不过这对我来说效果很好。
我不认为你可以 运行 Heroku 上的服务可以使用 docker 命令来启动一些 docker 容器。
I want to make a one click deployment solution through the use of Heroku Button deployment.
我认为您可以将“部署”按钮的引用更新到您的一些自动化服务器(例如:Jenkins 实例已经部署在 Heroku/another 云上)以触发部署管道并且不让人们交互用git/docker等
但是,是的,你必须处理很多问题,比如安全、参数。当不使用流行的解决方案时 Jenkins/CircleCI 登录然后部署...
很遗憾,您的问题的答案是:还没有。
出于安全原因,Heroku 不向用户提供 运行 特权容器的能力,因为容器可以访问主机功能。
该文档非常清楚您的 limitations,例如:没有 --priviledged
容器,也没有 root
用户,没有 VOLUMES
并且磁盘是临时的。
为了您的关心,在玩弄了 DinD 图像之后,我得出的结论是,尝试 运行 Docker 在 Heroku 容器中并不是正确的选择和设计。
我很确定您要实现的目标与 Heroku 向用户提供的目标接近。提供一个平台或应用程序,让非开发人员只需一个按钮就可以推送和部署应用程序,这在很多方面都非常有趣。这可以通过使用他们的平台 API 的应用程序来完成。
在这种情况下,Web 应用程序(Heroku 上的 运行ning)可能无法(据我所知)能够执行您想要的操作。相反,您需要嵌入桌面应用程序:git、docker 和您的应用程序,用于解析、验证、构建和推送您的 applications/components 到 Heroku 的容器注册表。
最后,如果您仍然认为您需要 DinD 解决方案,那么,您使用 VPS 的主要解决方案是目前唯一的解决方案。但请注意,它可能会给您的系统带来安全漏洞,并且您可能会在尝试限制这些安全门时提供类似于 Heroku 的产品。
为什么?
我正在尝试为 Heroku 上的 运行ning docker-compose 创建一个通用解决方案。我想通过使用 Heroku Button 部署来制作一键式部署解决方案。这样,用户不需要任何 git、Heroku cli 和 docker.
问题。
Docker 和 docker 守护程序仅在我将 stack
设置为 container
时可用。有一些构建包可以为您提供 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 守护进程不是 运行ning。解决方法是挂载它:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
并且由于您不能使用 Procfile
我不能 运行 该命令。 (见上文 heroku.yml
替换 Procfile
。)如果我使用的是构建包,我可以使用 Procfile
但 docker 守护进程不会 运行ning。 ....
我尝试在 Dockerfile
中定义一个 VOLUME
,但问题仍然存在。此外,一篇 heroku 文章说 "Volume mounting is not supported. The filesystem of the dyno is ephemeral."
在 Heroku 上,可以 运行 一个 docker 图像。我正在努力的是 运行 在 docker 图像中设置 docker。
运行 docker 图像中的 docker 通过安装 /var/run/docker.sock
在我的 VPS 上工作正常,但这不能(?)在 Heroku 上完成。
遗言: 我正在努力使这项工作有效,以便其他人即使不熟悉 git、heroku cli 和 docker 也可以轻松部署软件解决方案。
我所做的是将它安装在我的 docker 文件中,如下所示:
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 '--user root -v /var/run/docker.sock:/var/run/docker.sock'
有关此方法为何有效的进一步解释,请参阅:
我不认为你可以 运行 Heroku 上的服务可以使用 docker 命令来启动一些 docker 容器。
I want to make a one click deployment solution through the use of Heroku Button deployment.
我认为您可以将“部署”按钮的引用更新到您的一些自动化服务器(例如:Jenkins 实例已经部署在 Heroku/another 云上)以触发部署管道并且不让人们交互用git/docker等
但是,是的,你必须处理很多问题,比如安全、参数。当不使用流行的解决方案时 Jenkins/CircleCI 登录然后部署...
很遗憾,您的问题的答案是:还没有。
出于安全原因,Heroku 不向用户提供 运行 特权容器的能力,因为容器可以访问主机功能。
该文档非常清楚您的 limitations,例如:没有 --priviledged
容器,也没有 root
用户,没有 VOLUMES
并且磁盘是临时的。
为了您的关心,在玩弄了 DinD 图像之后,我得出的结论是,尝试 运行 Docker 在 Heroku 容器中并不是正确的选择和设计。 我很确定您要实现的目标与 Heroku 向用户提供的目标接近。提供一个平台或应用程序,让非开发人员只需一个按钮就可以推送和部署应用程序,这在很多方面都非常有趣。这可以通过使用他们的平台 API 的应用程序来完成。 在这种情况下,Web 应用程序(Heroku 上的 运行ning)可能无法(据我所知)能够执行您想要的操作。相反,您需要嵌入桌面应用程序:git、docker 和您的应用程序,用于解析、验证、构建和推送您的 applications/components 到 Heroku 的容器注册表。
最后,如果您仍然认为您需要 DinD 解决方案,那么,您使用 VPS 的主要解决方案是目前唯一的解决方案。但请注意,它可能会给您的系统带来安全漏洞,并且您可能会在尝试限制这些安全门时提供类似于 Heroku 的产品。