Docker-compose 编排
日常 docker-compose 编排时的一些坑及绕过
资料来源:
https://github.com/hedzr/docker-compose-file-format
更新
1
22021.03.22 初始
2021-05-16 填坑
导语
一不小心又忘了这个坑还没填…
同理,这一篇不是教程,只是个人写 docker-compose 时一些总结.
避免重复编译
有多个 docker 每个都指定 build 时,docker-compose 会按照容器名生成 image 名..于是有了一堆相同 image 却是不同名.
其实只要同时指定 image
就可以了这个应该刚开始使用 docker-compse 时没好好找资料的锅
1 | build: |
第一次 build 时会使用 image:latest
作为 image 名字.
以后每次 up 时都会看看有没有 image:latest
存在,没有再进行编译.
远程仓库 build 避免 git clone
有时直接使用 github 开源的 dockerfile 总是少不了 git clone.
依旧是后知后觉, build: context
可以直接写入 git repository 的 url.避免每次手动的 git clone.
ps: context
还支持相对路径/绝对路径.
限制 log 文件大小
从网上抄的,出处忘记了.这里指定文件最大 50mb 最大存到 10 个文件.
1 | logging: |
相同网络主机名互通
不同容器之间互通,注重性能就都用 host 网络,通过端口区分.不太介意可以分配到同一个 network
下直接使用名称互相访问.还能指定别名或多个别名.
1 | services: |
环境变量/拓展字段重用
docker-compose 是可以直接读取系统的环境变量的.使用 $(VAR)
或 $VAR
.
还可以在 docker-compose 的文件夹下新建 .env
文件,提供环境变量的默认值,定义新的环境变量.
这样能够将部分变动的配置从 yml 中分离出来.但是还不够.期望重用网络/ log 限制等配置需要使用拓展字段.(3.4/3.7 以上适用)
拓展字段
拓展字段类似大段的宏定义.
- 必须要在 yml 文件顶级声明.
- 以
x-
开始 &
后面是名称name
字段可有可无
拓展字段的结果是纯文本添加,不能识别层级或其他错误
1 | x-logging: |
使用
- 可以直接
logging: *default-logging
,全部展开,不替换, << : *default-logging
,使用 yaml 的语法,替换部分默认值.
1 | services: |
拓展字段是个人使用后感觉最重要的,终于告别大段的重复配置了.
启动多个 docker-compose 文件
docker-compose 支持 -f 导入多个文件,会自动合成一个执行动作.
但是就是懒,-f 麻烦的要死,version 2 中有个关键词 extend..但是 version 3 没了..(类似的还有网络定义中 ipv6 的支持…)
曲线救国
- 默认文件
docker-compose.yml
和docker-compose.override.yml
- docker-compose 会读取
docker-compose.yml
和docker-compose.override.yml
合并,不需要 -f - 曲线偷懒吧…