【问题标题】:Docker development workflow for compiled components in a docker-compose setupdocker-compose 设置中已编译组件的 Docker 开发工作流程
【发布时间】:2016-01-18 22:58:39
【问题描述】:

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

我尝试了 2 个“工作流程”,它们都依赖于通过 volume: 链接到源目录来获取最新源。

一种。
  • docker-compose up -d调出所有支持容器
  • 停止正在开发的服务的容器
  • 使用镜像docker-compose run --name SERVICE --rm SERVICE /bin/bash运行一个新容器
  • 在该容器中运行编译并在暴露的端口上运行应用程序。
  • 通过停止正在运行的进程然后重新构建来重新启动。
B.
  • (需要 Dockerfile CMD 来构建并运行服务)
  • 停止服务:docker-compose kill SERVICE
  • 重启服务docker-compose up -d --no-deps SERVICE

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

【问题讨论】:

  • docker 是在您的笔记本电脑上运行,还是远程运行?想知道“与在本地重新启动服务”是什么意思。是什么导致它“重启时间过长”?编译速度慢吗?开始了吗?
  • 我试图在问题中更清楚地说明这一点。 Docker 通过 docker-machine 运行。当我说“在本地运行”时,我的意思是在完全不使用 docker 的情况下构建和运行服务。这是一个选项,但这意味着我需要更改数据库 URL 等内容。
  • 啊,对,我最好的猜测是,首先,主机和 VirtualBox VM 之间的文件共享(说得好听一点)性能不是很好;这是 VirtualBox 文件共享的限制。其次,VM 可能未针对最大性能进行调整,这可能会影响编译持续时间。您是否尝试过,例如增加 VM 的内存量和/或 CPU 数量?
  • 不,我没有这样做。我会在 virtualbox 中执行此操作还是通过 docker-machine 命令执行此操作?
  • 创建新机器时可以指定附加选项; docs.docker.com/machine/drivers/virtualbox,例如 --virtualbox-memory--virtualbox-cpu-count。如果是用于现有机器,您可以使用 VirtualBox GUI,请参阅stackoverflow.com/questions/32834082/…

标签: docker build development-environment docker-compose


【解决方案1】:

我会这样做:

运行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 与与“运行”容器共享的卷目录相同,则可以跳过复制步骤。最后,脚本将向正在运行的容器发出信号,让它终止旧进程(正在运行旧二进制文件)并启动新进程。

如果共享卷在容器中编译太慢,您也可以在主机上运行编译,然后进行复制并发出信号使其在容器中运行。

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

【讨论】:

  • 您好,感谢您的深入回答。这已经解释了很多。正如您在此处概述的那样,我已经能够使其正常工作。不同之处在于,我无法让docker kill -s SIGHUP 工作,而是使用docker exec web pkill -f container_name。这可能没有那么快,但切换到这种方法已经大大减少了单次“迭代”的时间。谢谢。
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多