docker 如何更便捷的更新容器

2022-11-13 20:24:36 +08:00
 echooo0

版本迭代快的时候,docker 构建推送镜像很麻烦,下载上传整个镜像的数据很耗时间,

实际上改动的就是核心系统代码那一块,其他外部依赖没有动

所以,想把更新代码的步骤放到启动脚本里面去做,然后通过参数来设定,在 docker 启动的时候判断是否执行更新代

码的步骤,不知道这样是否可行

试了下 CMD 和 ENTRYPOINT , 在 docker run image_name -k (启动参数) 这样添加参数后,好像启动参数被固定了,

docker start 的时候不能灵活的修改,是否添加启动参数了

3438 次点击
所在节点    程序员
15 条回复
shiny
2022-11-13 20:31:32 +08:00
换个思路,让外部依赖能被缓存。比如 nodejs 使用 multi-stage build 后,package.json 如果没动过,这部分就会直接缓存。
beginor
2022-11-13 21:08:47 +08:00
搭 registry 私服,先推一个基础镜像上去, 比如 nodejs ,java spring , 然后再基于基础镜像编译 app 镜像
chiuan
2022-11-13 22:44:39 +08:00
程序镜像一般都不大吧。。。推送一下还能费几秒?
julyclyde
2022-11-14 09:18:12 +08:00
建议参考一下“immutable”这个概念,别在容器内做运行时更新

docker image 本身是分层的。你在 build 的时候安排一下顺序,把变动的放在最上层就能减少很多浪费了
palytoxin
2022-11-14 09:24:38 +08:00
之前离线部署过个 2g 的 ruby python 加一些依赖 c++库的混合镜像,镜像基本不变,部署时候把目录挂进去就行,你要多机部署就搞个 nfs
ragnaroks
2022-11-14 09:31:53 +08:00
#4 说得对,你打包镜像应当最后一步才是 copy 编译产物,那么当你的业务机器有上一次的镜像时,拉取最新镜像只会拉取最终不同的那一层,基本上也就是你的编译产物的体积
ragnaroks
2022-11-14 09:34:09 +08:00
FROM builder
......
COPY builder/artifact /app
WORKDIR /app
ENTRYPOINT /app/file

一般保持 CMD 空白用于运行时提供不同的参数
simonlu9
2022-11-14 09:34:50 +08:00
可以把依赖库和核心代码分离出来,比如 sprintboot 可以把 lib 不打包到镜像,只打包核心代码就可以
Latin
2022-11-14 10:12:34 +08:00
@julyclyde 针对需要依赖安装类的镜像 COPY 应放置最下层
libook
2022-11-14 11:20:59 +08:00
有些镜像比如 TTRSS 是在镜像内部的启动脚本更新代码,镜像本身就是个壳子,但每次启动都更新代码时间有点长,如果你不需要启动即可快速使用的话就可以考虑。

另外现在通常配合容器都会使用 CI 自动构建和自动部署,镜像规划好 Layer 也可以省很多时间和空间。
baleeny
2022-11-14 12:19:26 +08:00
4 楼+1
echooo0
2022-11-14 12:43:27 +08:00
@libook #10 所以我想的是,通过参数来指定,是否启动的时候执行更新代码的步骤。

但是 docker run image_name -k (启动参数) 这样添加参数后,启动参数好像被固定了,docker start 不能改变是否添加这个参数
julyclyde
2022-11-14 14:47:46 +08:00
@echooo0 是啊,你的程序应该适应无监管启动的场景
sdwgyzyxy
2022-11-15 08:48:00 +08:00
核心应该是编译+部署分开,例如 golang ,编译环境非常大,而项目真实运行的就是 build 之后的那个文件,很小很小。
rainfd
2022-11-15 10:44:25 +08:00
容器不复杂的可以用 ko 编译构建,或者直接使用 skaffold 本地 Ci

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/894929

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX