Docker docker-compose 设置中已编译组件的开发工作流程
Docker development workflow for compiled components in a docker-compose setup
我正在使用 docker-compose 编排的 'system' 服务。该服务是用编译语言编写的,我需要在进行更改时重新构建它。我正在尝试找到快速迭代更改的最佳方法。
我试过 2 'workflows',两者都依赖于通过 volume:
链接到源目录以获取最新的源。
一种。
- 用
docker-compose up -d
调出所有支持的容器
- 停止开发中服务的容器
- 运行 使用图像的新容器
docker-compose run --name SERVICE --rm SERVICE /bin/bash
- 在该容器中 运行 编译并 运行 在公开端口上的应用程序。
- 通过停止 运行ning 进程然后重建来重新启动。
B.
- (需要 Dockerfile
CMD
来构建然后 运行 服务)
- 停止服务:
docker-compose kill SERVICE
- 重启服务
docker-compose up -d --no-deps SERVICE
问题是 重新启动 与在本地重新启动服务(运行 在我的笔记本电脑上独立于 docker 相比)都需要太长时间。这种设置似乎适用于可以热重载更改文件的解释语言,但我还没有找到适合编译语言服务的快速系统。
我会这样做:
运行 docker-compose up
但是:
- 使用主机卷作为编译的 binary 的目录而不是源代码
- 使用
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" 容器共享的卷目录相同,则可以跳过复制步骤。最后,脚本将向 运行ning 容器发出信号,让它终止旧进程(运行ning 旧二进制文件)并启动新进程。
如果共享卷使容器中的编译速度太慢,您还可以 运行 在主机上编译,然后只进行复制和发送信号以将其 运行 放入容器中。
此解决方案的额外好处是您的 "runtime" 映像不需要所有开发依赖项。它可能是一个非常瘦的图像,只有一个 OS 基础。
我正在使用 docker-compose 编排的 'system' 服务。该服务是用编译语言编写的,我需要在进行更改时重新构建它。我正在尝试找到快速迭代更改的最佳方法。
我试过 2 'workflows',两者都依赖于通过 volume:
链接到源目录以获取最新的源。
- 用
docker-compose up -d
调出所有支持的容器
- 停止开发中服务的容器
- 运行 使用图像的新容器
docker-compose run --name SERVICE --rm SERVICE /bin/bash
- 在该容器中 运行 编译并 运行 在公开端口上的应用程序。
- 通过停止 运行ning 进程然后重建来重新启动。
- (需要 Dockerfile
CMD
来构建然后 运行 服务) - 停止服务:
docker-compose kill SERVICE
- 重启服务
docker-compose up -d --no-deps SERVICE
问题是 重新启动 与在本地重新启动服务(运行 在我的笔记本电脑上独立于 docker 相比)都需要太长时间。这种设置似乎适用于可以热重载更改文件的解释语言,但我还没有找到适合编译语言服务的快速系统。
我会这样做:
运行 docker-compose up
但是:
- 使用主机卷作为编译的 binary 的目录而不是源代码
- 使用
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" 容器共享的卷目录相同,则可以跳过复制步骤。最后,脚本将向 运行ning 容器发出信号,让它终止旧进程(运行ning 旧二进制文件)并启动新进程。
如果共享卷使容器中的编译速度太慢,您还可以 运行 在主机上编译,然后只进行复制和发送信号以将其 运行 放入容器中。
此解决方案的额外好处是您的 "runtime" 映像不需要所有开发依赖项。它可能是一个非常瘦的图像,只有一个 OS 基础。