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 参数的值。