docker-compose yaml的继承

41 min read
version: '3'

x-base: &base
  build:
    context: .
    dockerfile: Dockerfile
  ports:
    - "${PORT:-7861}:${PORT:-7861}"
  volumes:
    - &volume "./${VOLUME:-data}:/${VOLUME:-data}"

services:
  automatic1111-gpu: &gpu
    <<: *base
    profiles: ["gpu"]
    build:
      args:
        BUILD_ARGS: --medvram --allow-code --enable-insecure-extension-access --api --listen --port ${PORT} --exit
        RUN_ARGS: --medvram --allow-code --enable-insecure-extension-access --api --listen --port ${PORT}
        VOLUME: ${VOLUME:-data}
    deploy:
     resources:
       reservations:
         devices:
           - driver: nvidia
             device_ids: ['0']
             capabilities: [gpu]

  automatic1111-cpu:
    <<: *gpu
    profiles: ["cpu"]
    build:
      args:
        BUILD_ARGS: --lowvram --precision full --no-half --allow-code --enable-insecure-extension-access --api --listen --port ${PORT} --exit --skip-torch-cuda-test
        RUN_ARGS: --lowvram --precision full --no-half --allow-code --enable-insecure-extension-access --api --listen --port ${PORT}
        VOLUME: ${VOLUME:-data}
    deploy: {}

这里定义的服务名为 "automatic1111-gpu",它继承了另一个名为 "base" 的服务的属性(在代码片段中未显示)。 "&gpu" 和 "*gpu" 表示法用于在稍后的 "profiles" 部分中引用 "gpu" 配置。

"build" 部分指定了如何构建服务以及要使用哪些参数。它定义了环境变量,如 BUILD_ARGS、RUN_ARGS 和 VOLUME。

"deploy" 部分指定了如何在生产环境中部署服务。它定义了服务的资源预留,例如运行服务所需的设备和能力。在这种情况下,该服务需要具有设备 ID 0 的 GPU,并具备使用它的能力。

docker-compose yaml的继承

# 基本服务定义
services:
  base:
    image: ubuntu:latest
    environment:
      - ENV_VAR_1=value_1
      - ENV_VAR_2=value_2
    volumes:
      - ./data:/data

# 继承基本服务并添加其他属性
services:
  app1:
    <<: *base
    command: python app1.py
    ports:
      - "8000:8000"

# 继承基本服务并添加其他属性
services:
  app2:
    <<: *base
    command: python app2.py
    ports:
      - "8001:8001"
    volumes:
      - ./logs:/logs

在上面的示例中,定义了一个基本服务 "base",它指定了一个 Ubuntu 镜像、一些环境变量和一个数据卷。然后,"app1" 服务继承了 "base" 服务并添加了一个命令和一个端口映射。同样,"app2" 服务也继承了 "base" 服务,但它添加了一个不同的命令、一个不同的端口映射和一个附加的数据卷。

通过这种方式,可以使用继承来避免在 Docker Compose YAML 文件中重复定义相同的属性和值,提高代码的可读性和可维护性。

docker-compose deploy 属性

version: "3.7"

services:
  web:
    image: my-web-app
    deploy:
      mode: replicated
      replicas: 3
      resources:
        limits:
          cpus: "0.5"
          memory: "512M"
        reservations:
          cpus: "0.2"
          memory: "256M"
      update_config:
        delay: 5s
        order: start-first
      restart_policy:
        condition: on-failure

在上面的示例中,定义了一个名为 "web" 的服务,它指定了一个镜像和一个 "deploy" 属性。该服务使用了 "replicated" 模式,在其中部署了 3 个副本。它还指定了资源限制和预留,以确保服务使用的 CPU 和内存不会超过指定的值。此外,该服务还定义了一个更新配置,指定了一个延迟 5 秒的更新,并指定了服务的重启策略。

这个示例中的 "deploy" 属性包含以下选项:

  • "mode":定义了服务部署的模式。在这个示例中,使用了 "replicated" 模式,它可以创建多个副本。
  • "replicas":定义了在 "replicated" 模式下要创建的服务副本数。
  • "resources":定义了服务可以使用的资源限制和预留。在这个示例中,指定了 CPU 和内存的限制和预留。
  • "update_config":定义了服务更新的配置。在这个示例中,指定了更新延迟和启动顺序。
  • "restart_policy":定义了服务重启的策略。在这个示例中,指定了当服务失败时应该如何重启。

build args BUILD_ARGS RUN_ARGS 的区别

在 Docker Compose YAML 文件中,"build" 属性用于定义如何构建 Docker 镜像。"args" 属性用于定义构建过程中使用的构建参数。在构建过程中可以使用不同的构建参数来控制构建行为。在 "build" 属性中,有两种类型的构建参数:BUILD_ARGS 和 RUN_ARGS。

  • BUILD_ARGS:这是在构建时传递给构建过程的参数。在构建过程中,可以通过 $BUILD_ARGS 变量访问这些参数。可以使用这些参数来控制构建过程中的行为,例如定义编译器选项、传递版本号等。
  • RUN_ARGS:这是在容器运行时传递给容器的参数。在容器运行时,可以通过 $RUN_ARGS 变量访问这些参数。可以使用这些参数来控制容器运行时的行为,例如定义容器的端口号、传递环境变量等。

下面是一个示例,演示如何在 Docker Compose YAML 文件中使用 BUILD_ARGS 和 RUN_ARGS:

services:
  my-app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - BUILD_ARGS=value1
        - RUN_ARGS=value2

在上面的示例中,定义了一个名为 "my-app" 的服务,它使用了 "build" 属性来构建 Docker 镜像。在 "build" 属性中,使用了 "args" 属性来定义了 BUILD_ARGS 和 RUN_ARGS 两个构建参数。在构建过程中,可以通过 $BUILD_ARGS 变量访问 BUILD_ARGS 参数的值,在容器运行时,可以通过 $RUN_ARGS 变量访问 RUN_ARGS 参数的值。