我正在使用docker-compose在一个“系统”中进行服务.该服务是用编译语言编写的,我需要在进行更改时重建它.我正在努力寻找快速迭代变化的最佳方法.
我尝试了2个’工作流’,都依赖于通过卷链接到源目录:获取最新的源代码.
一个.
>用docker-compose up -d打开所有支撑容器
>停止正在开发的服务的容器
>使用图像docker-compose运行一个新容器–name SERVICE –rm SERVICE / bin / bash
>在该容器内运行编译并在暴露的端口运行应用程序.
>通过停止正在运行的进程然后重建来重新启动.
B.
>(需要Dockerfile CMD来构建然后运行服务)
>停止服务:docker-compose kill SERVICE
>重新启动服务docker-compose up -d –no-deps SERVICE
问题是重启时间太长而不能在本地重新启动服务(在我的笔记本电脑上独立于docker运行).对于可以热重新加载已更改文件的解释语言,此设置似乎没问题,但我还没有找到适合编译语言服务的快速系统.
运行docker-compose up但是:
>使用主机卷作为已编译二进制文件的目录而不是源
>使用类似的东西的入口点
entrypoint.sh:
trap "pkill -f the_binary_name" SIGHUP
trap "exit" SIGTERM
while [[ 1 ]]; do
./the_binary_name;
done
编写脚本来重建二进制文件,并将其复制到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与“run”容器共享的卷目录相同,则可以跳过复制步骤.最后,脚本将通知正在运行的容器使其终止旧进程(运行旧二进制文件)并启动新进程.
如果共享卷在容器中进行编译太慢,您还可以在主机上运行编译,并执行复制和信令以使其在容器中运行.
此解决方案的另一个好处是,您的“运行时”映像不需要所有的dev依赖项.它可能是一个非常精简的图像,只有一个简单的操作系统基础.