我在'系统中开展服务?使用docker-compose编排。该服务是用编译语言编写的,我需要在进行更改时重建它。我试图找到快速迭代更改的最佳方法。
我已尝试过2'工作流程',都依赖于通过volume:
链接到源目录以获取最新来源。
docker-compose up -d
docker-compose run --name SERVICE --rm SERVICE /bin/bash
CMD
构建然后运行服务)docker-compose kill SERVICE
docker-compose up -d --no-deps SERVICE
问题是需要花费很长时间才能重新启动 vs在本地重新启动服务(在我的笔记本电脑上独立于docker运行)。对于可以热重新加载已更改文件的解释语言,此设置似乎没问题,但我还没有为编译语言服务找到适当快速的系统。
答案 0 :(得分:4)
我会这样做:
运行docker-compose up
但是:
entrypoint
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依赖项。它可能是一个非常精简的图像,只有一个简单的操作系统基础。