在不停止容器的情况下复制/更新Docker容器中的代码

时间:2018-09-25 05:58:01

标签: apache docker docker-compose

我有一个docker-composer设置,其中我正在上传服务器的数据,例如flask api。现在,当我更改python代码时,我必须遵循这样的步骤

  1. 停止正在运行的容器(docker-compose stop)
  2. 在容器中构建并加载更新的代码(docker-compose up --build)

这需要一些时间。有什么更好的办法吗?像在运行的docker中更新代码,然后在不停止整个容器的情况下重新启动Apache服务器?

2 个答案:

答案 0 :(得分:0)

有几种肮脏的方法可以修改正在运行的容器的文件系统。 首先,您需要找到目录路径,该路径用作容器的运行时根。运行docker container inspect id/name。在JSON输出中寻找键UpperDir。您可以编辑/复制/删除该目录中的文件。

另一种方法是获取在容器内运行的进程的进程ID。转到/proc/process_id/root目录。这是在docker内部运行的进程的根目录。您可以即时对其进行编辑,更改将显示在容器中。

答案 1 :(得分:0)

您可以在旧容器仍在运行时运行docker build,并且停机时间仅限于转换期。

出于几个原因,将负载平衡器放在容器前面可能会有所帮助。根据您的应用程序,它可能是像HAProxy这样的“哑”负载平衡器,或是像nginx这样的完整Web服务器,或者是您的云提供商可以使用的东西。这使您可以一次在多个主机上运行该应用程序的多个副本(有助于扩展和提高可靠性)。在这种情况下,序列变为:

  1. docker build新图片
  2. docker run
  3. 将其连接到负载均衡器(现在流量流向新旧容器)
  4. 测试新容器是否正常工作
  5. 从负载均衡器上卸下旧容器
  6. docker stop && docker rm旧容器

如果您不介意使用重量级的基础架构,那么此顺序基本上就是您更改Kubernetes部署对象中的图像标签时发生的事情,但是采用Kubernetes是一项重大的承诺。