Docker-compose setup

时间:2016-01-18 22:58:40

标签: docker build development-environment docker-compose

我在'系统中开展服务?使用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

问题是需要花费很长时间才能重新启动 vs在本地重新启动服务(在我的笔记本电脑上独立于docker运行)。对于可以热重新加载已更改文件的解释语言,此设置似乎没问题,但我还没有为编译语言服务找到适当快速的系统。

1 个答案:

答案 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依赖项。它可能是一个非常精简的图像,只有一个简单的操作系统基础。