版本迭代快的时候,docker 构建推送镜像很麻烦,下载上传整个镜像的数据很耗时间,
实际上改动的就是核心系统代码那一块,其他外部依赖没有动
所以,想把更新代码的步骤放到启动脚本里面去做,然后通过参数来设定,在 docker 启动的时候判断是否执行更新代
码的步骤,不知道这样是否可行
试了下 CMD 和 ENTRYPOINT , 在 docker run image_name -k (启动参数) 这样添加参数后,好像启动参数被固定了,
docker start 的时候不能灵活的修改,是否添加启动参数了
1
shiny 2022-11-13 20:31:32 +08:00
换个思路,让外部依赖能被缓存。比如 nodejs 使用 multi-stage build 后,package.json 如果没动过,这部分就会直接缓存。
|
2
beginor 2022-11-13 21:08:47 +08:00 via Android
搭 registry 私服,先推一个基础镜像上去, 比如 nodejs ,java spring , 然后再基于基础镜像编译 app 镜像
|
3
chiuan 2022-11-13 22:44:39 +08:00
程序镜像一般都不大吧。。。推送一下还能费几秒?
|
4
julyclyde 2022-11-14 09:18:12 +08:00
建议参考一下“immutable”这个概念,别在容器内做运行时更新
docker image 本身是分层的。你在 build 的时候安排一下顺序,把变动的放在最上层就能减少很多浪费了 |
5
palytoxin 2022-11-14 09:24:38 +08:00
之前离线部署过个 2g 的 ruby python 加一些依赖 c++库的混合镜像,镜像基本不变,部署时候把目录挂进去就行,你要多机部署就搞个 nfs
|
6
ragnaroks 2022-11-14 09:31:53 +08:00
#4 说得对,你打包镜像应当最后一步才是 copy 编译产物,那么当你的业务机器有上一次的镜像时,拉取最新镜像只会拉取最终不同的那一层,基本上也就是你的编译产物的体积
|
7
ragnaroks 2022-11-14 09:34:09 +08:00
FROM builder
...... COPY builder/artifact /app WORKDIR /app ENTRYPOINT /app/file 一般保持 CMD 空白用于运行时提供不同的参数 |
8
simonlu9 2022-11-14 09:34:50 +08:00
可以把依赖库和核心代码分离出来,比如 sprintboot 可以把 lib 不打包到镜像,只打包核心代码就可以
|
10
libook 2022-11-14 11:20:59 +08:00
有些镜像比如 TTRSS 是在镜像内部的启动脚本更新代码,镜像本身就是个壳子,但每次启动都更新代码时间有点长,如果你不需要启动即可快速使用的话就可以考虑。
另外现在通常配合容器都会使用 CI 自动构建和自动部署,镜像规划好 Layer 也可以省很多时间和空间。 |
11
baleeny 2022-11-14 12:19:26 +08:00
4 楼+1
|
12
echooo0 OP @libook #10 所以我想的是,通过参数来指定,是否启动的时候执行更新代码的步骤。
但是 docker run image_name -k (启动参数) 这样添加参数后,启动参数好像被固定了,docker start 不能改变是否添加这个参数 |
14
sdwgyzyxy 2022-11-15 08:48:00 +08:00
核心应该是编译+部署分开,例如 golang ,编译环境非常大,而项目真实运行的就是 build 之后的那个文件,很小很小。
|
15
rainfd 2022-11-15 10:44:25 +08:00
容器不复杂的可以用 ko 编译构建,或者直接使用 skaffold 本地 Ci
|