Docker编译场景下如何复用容器避免重复下载依赖并执行外部脚本
解决方案
1. 避免重复下载依赖的实现方案
有两种成熟方案可选,优先推荐自定义镜像方案,可复用性更强:
方案A:构建包含依赖的自定义镜像
把所有编译需要的依赖提前打包到镜像中,后续无论启动多少容器都无需重新下载依赖:
- 首先基于官方基础镜像启动临时容器,完成依赖安装:
# 替换<官方基础镜像名>为你当前使用的Docker镜像名,比如golang:1.21、ubuntu:22.04等 docker run -it --name temp_build_env <官方基础镜像名> /bin/bash
- 进入容器后执行所有依赖安装操作,完成后执行
exit退出容器 - 将配置完成的容器提交为本地自定义镜像:
docker commit temp_build_env my_build_env:v1
- 删除临时容器释放资源:
docker rm temp_build_env
如果需要更规范的版本管理,也可以编写Dockerfile把依赖安装步骤写入配置,直接docker build生成镜像,后续更新依赖只需修改Dockerfile重新构建即可,可追溯性更强
方案B:复用预先创建的持久化容器
如果不想构建自定义镜像,可以直接创建一个固定容器,编译时启动、用完关闭,只要不删除容器,所有已安装的依赖都会保留在容器的可写层:
- 第一次创建固定名称的容器,配置好本地目录挂载等参数:
# 替换本地目录、镜像名等参数为你实际的配置 docker create -it --name fixed_build_container -v /本地/代码目录:/容器内/代码目录 my_build_env:v1 /bin/bash
- 需要编译时启动容器:
docker start fixed_build_container
- 编译完成后停止容器即可:
docker stop fixed_build_container
2. 外部执行编译脚本并查看输出的实现
无需进入容器,直接通过Docker命令指定执行脚本,所有输出会直接打印到宿主机终端,和本地执行脚本效果一致:
- 如果使用上述持久化容器方案,执行命令如下:
# 替换/容器内/编译脚本路径为实际的脚本路径,-i参数保证输出正常回显到宿主机 docker exec -i fixed_build_container /bin/bash /容器内/编译脚本路径
- 如果使用自定义镜像临时启动容器的方案(更推荐,执行完成自动删除容器无残留),命令如下:
# --rm参数表示执行完自动销毁容器,依赖已经在镜像内无需重新下载 docker run --rm -v /本地/代码目录:/容器内/代码目录 my_build_env:v1 /bin/bash /容器内/代码目录/build.sh
如果你的编译脚本放在挂载的本地目录中,只要路径对应正确,无需提前拷贝到容器内即可直接执行
内容的提问来源于stack exchange,提问作者Gerrie
相关产品推荐
相关产品推荐

