Docker How-tos

自定义项目名称

默认会使用当前 compose.yaml 所处文件夹的名称作为 project name 。使用 project name 来隔离各个环境。

  1. 在开发主机上:创建单个环境的多个副本,这对于为项目的每个功能分支运行稳定副本很有用
    • saas 化的场景
    • 私有定制化的场景
  2. 在 CI 服务器上:通过将项目名称设置为唯一的构建编号来防止构建之间的干扰
  3. 在共享或开发主机上:避免可能共享相同服务名称的不同项目之间的干扰

项目名称只能包含 小写字母、十进制数字、破折号 和 下划线,并且必须以 小写字母 或 十进制数字 开头

优先级如下 - 从高到低:

  1. -p 命令行标志

    1
    docker compose -p demo_project up
  2. 设置 COMPOSE_PROJECT_NAME 环境变量

    1
    2
    export COMPOSE_PROJECT_NAME=demo_project
    docker compose up
  3. 在 Compose 文件中使用顶级的 name 属性

    1
    2
    3
    4
    name: my_custom_project
    services:
    web:
    image: nginx
  4. 使用多个 Compose 文件时的最后一个 name 属性,当通过 -f 标志指定多个 Compose 文件时,最后一个文件中定义的 name 属性生效

    • 文件 docker-compose.yml:

      1
      2
      3
      4
      name: project_a
      services:
      web:
      image: nginx
    • 文件 docker-compose.override.yml:

      1
      2
      3
      4
      5
      name: 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
2
3
4
5
6
7
8
9
10
11
12
services:
app:
image: backend
user: 1001
volumes:
- data:/data
post_start:
- command: chown -R /data 1001:1001
user: root

volumes:
data: {} # a Docker volume is created with root ownership
  • 该钩子用于将卷的所有权更改为非 root 用户(因为卷默认以 root 所有权创建)。

  • 容器启动后, chown 命令会将 /data 目录的所有权更改为用户 1001。

结束前

在容器被特定命令(例如 docker compose down 或使用 Ctrl+C 手动停止)停止之前运行的命令。如果容器自行停止或被突然终止,这些钩子将不会运行

1
2
3
4
5
services:
app:
image: backend
pre_stop:
- command: ./data_flush.sh

在容器停止之前,将运行 ./data_flush.sh 脚本来执行任何必要的清理

在 Compose 中使用 profiles

在 compose.yaml 中配置 profiles 可以用来方便切换到不同的环境或者用例中。服务可以被标注一个或多个 profiles。未标注的服务默认为 default 。

给服务标注环境 profiles

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
services:
frontend:
image: frontend
profiles: [frontend]

phpmyadmin:
image: phpmyadmin
depends_on: [db]
profiles: [debug]

backend:
image: backend

db:
image: mysql
  • frontend 服务被标注为 frontend 环境
  • phpmyadmin 服务标注为 debug 环境

启动对应的配置,使用提供 —profile 命令行选项或使用 COMPOSE_PROFILES 环境变量

1
2
3
4
5
# --profile
docker compose --profile debug up

# -- env
COMPOSE_PROFILES=debug docker compose up

会启动 phpmyadmin , backend , db 这3个服务

多个 profiles

通过传递多个 —profile 标志或 COMPOSE_PROFILES 环境变量的逗号分隔列表来指定多个配置文件

1
2
3
4
5
6
docker compose --profile frontend --profile debug up

COMPOSE_PROFILES=frontend,debug docker compose up

# 启用所有配置文件,可以运行
docker compose --profile "*"

自动启动的 profiles 和 依赖关系解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
services:
backend:
image: backend

db:
image: mysql

db-migrations:
image: backend
command: myapp migrate
depends_on:
- db
profiles:
- tools

可以用于一次性服务和调试工具

命令:

1
2
3
4
5
6
# 只会启动 backend 和 db
docker compose up -d

# 运行 db-migrations (并且,如有必要,启动 db)
# 通过隐式启用配置文件 profiles `tools`
docker compose run db-migrations

db 服务 profiles 需要为空或者和 db-migrations 是同一个 profiles

关闭一些配置

与启动特定配置文件一样,您可以使用 —profile 命令行选项或使用 COMPOSE_PROFILES 环境变量:

1
2
3
docker compose --profile debug down

COMPOSE_PROFILES=debug docker compose down

在该配置中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
services:
frontend:
image: frontend
profiles: [frontend]

phpmyadmin:
image: phpmyadmin
depends_on: [db]
profiles: [debug]

backend:
image: backend

db:
image: mysql

会停止 db、backend 和 phpmyadmin

停止并移除带有 debug 配置文件的服务以及不带该配置文件的服务,如果只想停止 phpmyadmin

1
2
3
docker compose down phpmyadmin

docker compose stop phpmyadmin

在 Compose 中控制启动和关闭顺序

通过 depends_one 来控制服务启动和关闭的顺序。compose 按照依赖顺序启动和停止容器服务,其中依赖关系由 depends_on,links,volumes_from 和 network_mode:”service:…” 决定。

比如在应用服务启动前,启动数据库,缓存等

在启动时,Compose 不会等到容器“准备好”,而只会等到它运行

检测服务就绪状态的解决方案是使用带有以下选项之一的条件属性

  • service_started
  • service_headlthy
  • service_completed_successfully

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
web:
build: .
depends_on:
db:
condition: service_healthy
restart: true
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
retries: 5
start_period: 30s
timeout: 10s

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 之前被删除。

- the End -
0%