Docker 在部署另一个容器后重新启动容器

Docker 在部署另一个容器后重新启动容器,docker,dokku,Docker,Dokku,我有一个项目使用Dokku在一台服务器上运行多个web应用程序。让我们假设web应用程序/容器是A、B和C,然后我有一个容器D,它不是web应用程序,而是容器A、B和C之间共享代码库的集合(例如DB模型定义、配置等) 一切都很好,但问题是当容器D更新时,我需要重新启动所有其他容器(A、B和C),以便它们可以看到应用的更改。我的第一个想法是在容器D中有一个脚本,该脚本将在post deploy触发器上执行,但由于该脚本将在容器中运行,这意味着它无法访问主机的文件 由于我最近才开始使用Dokku,我

我有一个项目使用Dokku在一台服务器上运行多个web应用程序。让我们假设web应用程序/容器是A、B和C,然后我有一个容器D,它不是web应用程序,而是容器A、B和C之间共享代码库的集合(例如DB模型定义、配置等)

一切都很好,但问题是当容器D更新时,我需要重新启动所有其他容器(A、B和C),以便它们可以看到应用的更改。我的第一个想法是在容器D中有一个脚本,该脚本将在
post deploy
触发器上执行,但由于该脚本将在容器中运行,这意味着它无法访问主机的文件

由于我最近才开始使用Dokku,我想知道在成功部署容器D之后,最简单的执行方法是什么:

dokku ps:restart A
dokku ps:restart B
dokku ps:restart C
您可以使用“部署后”脚本选项。您可以将docker套接字安装到D容器上。这样,容器D可以通过以下方式运行并重新启动其他容器:

curl --unix-socket /var/run/docker.sock -X POST http:/v1.24/containers/<container-name>/restart

感谢@yamenk,完整答案是:

  • 通过为容器D添加
    apk add--no cache curl
    inside
    Dockerfile
    确保容器D中安装了
    curl
  • 通过如下方式装载存储,将套接字添加到容器D中主机的Docker:
    dokku存储:mount D/var/run/Docker.sock:/var/run/Docker.sock
  • post-deploy
    script内部运行以下命令:
    curl--unixsocket/var/run/docker.sock-X post-http:/{docker-api版本}/containers/{container-name}/restart
  • 重新启动容器D
  • 旧答案

    在@yamenk的帮助下,使用问题中的示例容器回答我自己的问题:

  • 通过为容器D添加
    apk add--no cache docker
    inside
    Dockerfile
    ,确保容器D中安装了
    docker
  • 通过如下方式装载存储,将套接字添加到容器D中主机的Docker:
    dokku存储:mount D/var/run/Docker.sock:/var/run/Docker.sock
  • 重新启动容器D

  • 感谢您为我指出了正确的方向,但我仍然需要深入了解我还需要在容器D中安装Docker。您不需要在容器中安装Docker。通过安装docker套接字,您应该能够在主机上运行docker命令。我不知道是否应该,但它不起作用。当我试图从容器D中运行
    docker
    时(没有安装docker),我得到
    docker:没有这样的文件或目录
    。如果我也尝试挂载
    /usr/bin/docker
    ,那么我会得到类似的错误:
    /usr/bin/docker:没有这样的文件或目录
    。在容器D中安装Docker是唯一的解决方案。Docker具有客户机-服务器体系结构。Docker命令可以通过curl发出。例如,要重新启动一个容器,只需发出:
    curl--unixsocket/var/run/docker.sock-xpost-http:/v1.24/containers//restart
    。如果装载了
    docker.sock
    ,则可以从容器内部发出此命令。不需要在容器内安装docker,而需要一个更大的容器。
    docker run -v /var/run/docker.sock:/var/run/docker.sock ...