Docker compose设置中已编译组件的Docker开发工作流

Docker compose设置中已编译组件的Docker开发工作流,docker,build,development-environment,docker-compose,Docker,Build,Development Environment,Docker Compose,我正在使用docker compose在“系统”中处理一项服务。该服务是用编译语言编写的,我需要在进行更改时重新构建它。我试图找到快速迭代更改的最佳方法 我尝试了两个“工作流”,它们都依赖于通过卷链接到源目录:来获取最新的源代码 A. 使用docker compose up-d打开所有支持容器 停止正在开发的服务的容器 使用imagedocker compose Run--name SERVICE--rm SERVICE/bin/bash运行一个新容器 在该容器中,在公开的端口编译并运行应用程

我正在使用docker compose在“系统”中处理一项服务。该服务是用编译语言编写的,我需要在进行更改时重新构建它。我试图找到快速迭代更改的最佳方法

我尝试了两个“工作流”,它们都依赖于通过
卷链接到源目录:
来获取最新的源代码

A.
  • 使用
    docker compose up-d打开所有支持容器
  • 停止正在开发的服务的容器
  • 使用image
    docker compose Run--name SERVICE--rm SERVICE/bin/bash运行一个新容器
  • 在该容器中,在公开的端口编译并运行应用程序
  • 通过停止正在运行的进程然后重新生成来重新启动
B
  • (需要Dockerfile
    CMD
    来生成并运行服务)
  • 停止服务:
    docker compose kill服务
  • 重新启动服务
    docker compose up-d--无deps服务
问题是与在本地重新启动服务(在我的笔记本电脑上独立于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”容器共享的卷目录相同,则可以跳过复制步骤。最后,脚本将向正在运行的容器发送信号,让它杀死旧进程(运行旧二进制文件的进程)并启动新进程

如果共享卷使容器中的编译速度过慢,您也可以在主机上运行编译,只需进行复制并发出信号,使其在容器中运行


此解决方案还有一个额外的好处,即您的“运行时”映像不需要所有的开发依赖项。它可能是一个非常精简的映像,只有一个简单的操作系统基础。

docker是在您的笔记本电脑上运行,还是远程运行?想知道“vs在本地重新启动服务”是什么意思。是什么导致“重启时间过长”?编译速度慢吗?开始?我试图在问题中更清楚地说明这一点。Docker通过Docker机器运行。当我说“在本地运行”时,我指的是在根本不使用docker的情况下构建和运行服务。这是一个选项,但它意味着我需要更改数据库URL等。啊,对了,我最好的猜测是,首先,主机和VirtualBox VM之间的文件共享(很好地说)不是很好;这是VirtualBox文件共享的一个限制。第二,VM可能没有针对最大性能进行调优,这可能会影响编译持续时间。您是否尝试过提高虚拟机的内存量和/或CPU数量?不,我没有这样做。我是在virtualbox中还是通过docker machine命令执行此操作?您可以在创建新机器时指定其他选项,例如
--virtualbox内存
--virtualbox cpu计数
。如果是针对现有的机器,您可以使用VirtualBox GUI,请参见Hi,感谢您提供的深入回答。这解释了很多。我已经能够让它像你在这里概述的那样工作了。一个不同之处是,我无法让docker kill-s SIGHUP工作,我使用的是docker exec web pkill-f container_name
。这可能没有那么快,但切换到这种方法大大缩短了单个“迭代”的时间。谢谢