Docker-compose设置中已编译组件的Docker开发工作stream程

我正在使用docker-compose编排一个“系统”中的服务。 该服务是用编译语言编写的,我需要在更改时重新编译。 我试图find快速迭代更改的最佳方法。

我已经尝试了2个'工作stream程',都依靠通过volume:链接到源目录volume:获取最新的来源。

一个。

  • 用docker组装起来所有的支撑容器, docker-compose up -d
  • 停止正在开发的服务的容器
  • 使用镜像docker-compose run --name SERVICE --rm SERVICE /bin/bash运行一个新的容器docker-compose run --name SERVICE --rm SERVICE /bin/bash
  • 在该容器中运行编译并在暴露的端口上运行应用程序。
  • 重新开始,停止正在运行的过程,然后重build。

B.

  • (需要Dockerfile CMD来构build然后运行该服务)
  • 停止服务: docker-compose kill SERVICE
  • 重新启动服务docker-compose up -d --no-deps SERVICE

问题是重新启动 vs重启本地服务(独立于docker运行在我的笔记本电脑上) 需要很长时间 。 这种设置似乎可以解释的语言,可以热重新加载更改的文件,但我还没有find一个适合编译语言服务的快速系统。

我会这样做:

运行docker-compose up但是:

  • 使用主机卷作为编译二进制文件的目录而不是源文件
  • 使用一个类似的entrypoint

entrypoint.sh:

 trap "pkill -f the_binary_name" SIGHUP trap "exit" SIGTERM while [[ 1 ]]; do ./the_binary_name; done 

编写一个脚本来重build二进制文件,并将其复制到docker-compose.yml的服务使用的卷中:

 # Run a container to compile and build the binary docker run -ti -v $SOURCE:/path -v $DEST:/target some_image build_the_binary # copy it to the host volume directory copy $DEST/... /volume/shared/with/running/container # signal the container docker kill -s SIGHUP container_name 

所以要编译这个二进制文件,你需要使用这个脚本,它将源和目的地目录挂载为卷。 如果$DEST与“运行”容器共享的卷目录相同,则可以跳过复制步骤。 最后脚本会发出运行容器的信号,让它杀死旧的进程(运行旧的二进制文件)并启动新的进程。

如果共享卷在一个容器中编译速度太慢,也可以在主机上运行编译,只需执行复制和信号发送就可以在容器中运行。

这个解决scheme还有另外一个好处,就是你的“运行时”映像不需要所有的开发依赖。 这可能是一个非常精简的形象,只有一个裸露的操作系统基础。