自定义项目名称
默认会使用当前 compose.yaml 所处文件夹的名称作为 project name 。使用 project name 来隔离各个环境。
- 在开发主机上:创建单个环境的多个副本,这对于为项目的每个功能分支运行稳定副本很有用
- saas 化的场景
- 私有定制化的场景
- 在 CI 服务器上:通过将项目名称设置为唯一的构建编号来防止构建之间的干扰
- 在共享或开发主机上:避免可能共享相同服务名称的不同项目之间的干扰
项目名称只能包含 小写字母、十进制数字、破折号 和 下划线,并且必须以 小写字母 或 十进制数字 开头
优先级如下 - 从高到低:
-p命令行标志1
docker compose -p demo_project up
设置 COMPOSE_PROJECT_NAME 环境变量
1
2export COMPOSE_PROJECT_NAME=demo_project
docker compose up在 Compose 文件中使用顶级的 name 属性
1
2
3
4name: my_custom_project
services:
web:
image: nginx使用多个 Compose 文件时的最后一个 name 属性,当通过
-f标志指定多个 Compose 文件时,最后一个文件中定义的 name 属性生效文件 docker-compose.yml:
1
2
3
4name: project_a
services:
web:
image: nginx文件 docker-compose.override.yml:
1
2
3
4
5name: project_b
services:
web:
ports:
- "8080:80"运行命令:
1
docker compose -f docker-compose.yml -f docker-compose.override.yml up
由于 docker-compose.override.yml 是最后一个指定的文件,其 name: project_b 生效,项目名称为 project_b。由于 docker-compose.override.yml 是最后一个指定的文件,其 name: project_b 生效,项目名称为 project_b。
Compose 生命周期钩子
启动后
在容器启动后运行,但具体执行时间没有固定。在容器入口点执行期间,钩子的执行时间无法确定。
例子:
1 | services: |
该钩子用于将卷的所有权更改为非 root 用户(因为卷默认以 root 所有权创建)。
容器启动后, chown 命令会将 /data 目录的所有权更改为用户 1001。
结束前
在容器被特定命令(例如 docker compose down 或使用 Ctrl+C 手动停止)停止之前运行的命令。如果容器自行停止或被突然终止,这些钩子将不会运行
1 | services: |
在容器停止之前,将运行 ./data_flush.sh 脚本来执行任何必要的清理
在 Compose 中使用 profiles
在 compose.yaml 中配置 profiles 可以用来方便切换到不同的环境或者用例中。服务可以被标注一个或多个 profiles。未标注的服务默认为 default 。
给服务标注环境 profiles
1 | services: |
- frontend 服务被标注为 frontend 环境
- phpmyadmin 服务标注为 debug 环境
启动对应的配置,使用提供 —profile 命令行选项或使用 COMPOSE_PROFILES 环境变量
1 | # --profile |
会启动 phpmyadmin , backend , db 这3个服务
多个 profiles
通过传递多个 —profile 标志或 COMPOSE_PROFILES 环境变量的逗号分隔列表来指定多个配置文件
1 | docker compose --profile frontend --profile debug up |
自动启动的 profiles 和 依赖关系解析
1 | services: |
可以用于一次性服务和调试工具
命令:
1 | # 只会启动 backend 和 db |
db 服务 profiles 需要为空或者和 db-migrations 是同一个 profiles
关闭一些配置
与启动特定配置文件一样,您可以使用 —profile 命令行选项或使用 COMPOSE_PROFILES 环境变量:
1 | docker compose --profile debug down |
在该配置中
1 | services: |
会停止 db、backend 和 phpmyadmin
停止并移除带有 debug 配置文件的服务以及不带该配置文件的服务,如果只想停止 phpmyadmin
1 | docker compose down phpmyadmin |
在 Compose 中控制启动和关闭顺序
通过 depends_one 来控制服务启动和关闭的顺序。compose 按照依赖顺序启动和停止容器服务,其中依赖关系由 depends_on,links,volumes_from 和 network_mode:”service:…” 决定。
比如在应用服务启动前,启动数据库,缓存等
在启动时,Compose 不会等到容器“准备好”,而只会等到它运行
检测服务就绪状态的解决方案是使用带有以下选项之一的条件属性
- service_started
- service_headlthy
- service_completed_successfully
例子
1 | services: |
Compose 按照依赖顺序创建服务。数据库(db)和 Redis 在 web 之前创建。
Compose 等待标记为 service_healthy 的依赖项的健康检查通过。数据库(db)需在健康检查显示“healthy”后,web 才会创建。
restart: true 确保如果数据库(db)因显式的 Compose 操作(例如 docker compose restart)被更新或重启,web 服务也会自动重启,以确保正确重新建立连接或依赖关系。
数据库(db)服务的健康检查使用 pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB} 命令检查 PostgreSQL 数据库是否准备就绪。服务每 10 秒重试一次,最多重试 5 次。
Compose 也按照依赖顺序删除服务。web 在数据库(db)和 Redis 之前被删除。