服务顶级元素
服务是应用程序中计算资源的抽象定义,可以扩展或替换 独立于其他组件。服务由一组容器提供支持,这些容器由平台运行 根据复制要求和放置约束。由于服务由容器提供支持,因此它们被定义 通过 Docker 镜像和一组运行时参数。服务中的所有容器都是使用这些容器创建的 参数。
Compose 文件必须声明services
top-level 元素作为 Map,其键是服务名称的字符串表示形式,
其值为 Service Definitions。服务定义包含应用于每个
服务容器。
每项服务还可能包括build
部分,该部分定义如何为服务创建 Docker 镜像。
Compose 支持使用此服务定义构建 Docker 镜像。如果未使用,则build
部分将被忽略,并且 Compose 文件仍被视为有效。构建支持是 Compose 规范的一个可选方面,并且是
Compose Build 规范文档中详细介绍了。
每个服务都定义了运行其容器的运行时约束和要求。这deploy
分区组
这些约束,并允许平台调整部署策略,以最好地满足容器的需求
可用资源。部署支持是 Compose 规范的一个可选方面,并且是
在 Compose Deploy 规范文档中进行了详细介绍。
如果未实现deploy
部分将被忽略,并且 Compose 文件仍被视为有效。
例子
简单示例
以下示例演示了如何使用 Docker Compose 定义两个简单服务、设置其镜像、映射端口和配置基本环境变量。
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: postgres:13
environment:
POSTGRES_USER: example
POSTGRES_DB: exampledb
高级示例
在以下示例中,proxy
service 使用 Nginx 镜像,将本地 Nginx 配置文件挂载到容器中,暴露 port80
并依赖于backend
服务。
这backend
service 从位于backend
设置为在阶段生成builder
.
services:
proxy:
image: nginx
volumes:
- type: bind
source: ./proxy/nginx.conf
target: /etc/nginx/conf.d/default.conf
read_only: true
ports:
- 80:80
depends_on:
- backend
backend:
build:
context: backend
target: builder
如需更多示例 Compose 文件,请浏览 Awesome Compose 示例。
属性
附注
annotations
定义容器的注释。annotations
可以使用 array 或 map。
annotations:
com.example.foo: bar
annotations:
- com.example.foo=bar
附加
什么时候attach
定义并设置为false
Compose 不收集服务日志,
,直到您明确请求它。
默认服务配置为attach: true
.
建
build
指定用于从源创建容器镜像的构建配置,如 Compose 构建规范中所定义。
blkio_config
blkio_config
定义一组配置选项,用于设置服务的块 IO 限制。
services:
foo:
image: busybox
blkio_config:
weight: 300
weight_device:
- path: /dev/sda
weight: 400
device_read_bps:
- path: /dev/sdb
rate: '12mb'
device_read_iops:
- path: /dev/sdb
rate: 120
device_write_bps:
- path: /dev/sdb
rate: '1024k'
device_write_iops:
- path: /dev/sdb
rate: 30
device_read_bps、device_write_bps
为给定设备上的读/写作设置每秒字节数限制。 列表中的每个项目都必须有两个键:
path
:定义受影响设备的符号路径。rate
:作为表示字节数的整数值或表示字节值的字符串。
device_read_iops、device_write_iops
为给定设备上的读/写作设置每秒作数限制。 列表中的每个项目都必须有两个键:
path
:定义受影响设备的符号路径。rate
:作为整数值,表示每秒允许的作数。
重量
修改分配给服务的带宽相对于其他服务的比例。 采用 10 到 1000 之间的整数值,其中 500 是默认值。
weight_device
按设备微调带宽分配。列表中的每个项目都必须有两个键:
path
:定义受影响设备的符号路径。weight
:介于 10 和 1000 之间的整数值。
cpu_count
cpu_count
定义服务容器的可用 CPU 数量。
cpu_percent
cpu_percent
定义可用 CPU 的可用百分比。
cpu_shares
cpu_shares
以整数值定义服务容器相对于其他容器的相对 CPU 权重。
cpu_period
cpu_period
配置平台所基于的 CPU CFS(完全公平调度程序)周期
在 Linux 内核上。
cpu_quota
cpu_quota
在平台基于时配置 CPU CFS (Completely Fair Scheduler) 配额
在 Linux 内核上。
cpu_rt_runtime
cpu_rt_runtime
为支持 Realtime Scheduler 的平台配置 CPU 分配参数。它可以是
使用微秒作为单位或持续时间的整数值。
cpu_rt_runtime: '400ms'
cpu_rt_runtime: 95000`
cpu_rt_period
cpu_rt_period
为支持 Realtime Scheduler 的平台配置 CPU 分配参数。它可以是
使用微秒作为单位或持续时间的整数值。
cpu_rt_period: '1400us'
cpu_rt_period: 11000`
CPU
cpus
定义要分配给服务容器的 (可能是虚拟的) CPU 的数量。这是一个小数。0.000
表示无限制。
设置后,cpus
必须与cpus
属性。
cpuset
cpuset
定义允许在其中执行的显式 CPU。可以是范围0-3
或列表0,1
cap_add
cap_add
将其他容器功能指定为字符串。
cap_add:
- ALL
cap_drop
cap_drop
指定要删除的容器功能
作为字符串。
cap_drop:
- NET_ADMIN
- SYS_ADMIN
cgroup
cgroup
指定要加入的 cgroup 命名空间。如果未设置,则由容器运行时决定
选择要使用的 cgroup 命名空间(如果支持)。
host
:在容器运行时 cgroup 命名空间中运行容器。private
:在容器自己的私有 cgroup 命名空间中运行容器。
cgroup_parent
cgroup_parent
为容器指定可选的父 cgroup。
cgroup_parent: m-executor-abcd
命令
command
覆盖容器镜像声明的默认命令,例如由 Dockerfile 的CMD
.
command: bundle exec thin -p 3000
该值也可以是列表,其方式类似于 Dockerfile:
command: [ "bundle", "exec", "thin", "-p", "3000" ]
如果值为null
时,将使用镜像中的默认命令。
如果值为 (empty list) 或 (empty string),则忽略镜像声明的默认命令,
即 overridden 为空。[]
''
配置
配置允许服务调整其行为,而无需重新构建 Docker 镜像。
服务只有在configs
属性。支持两种不同的语法变体。
如果出现config
在平台上不存在,或者未在configs
顶级元素在 Compose 文件中。
为 config 定义了两种语法:short 语法和 long 语法。
您可以向服务授予对多个配置的访问权限,并且可以混合使用长语法和短语法。
短语法
短语法变体仅指定配置名称。这将授予
容器访问配置,并将其作为文件挂载到服务的容器的文件系统中。容器中挂载点的位置默认为/<config_name>
在 Linux 容器中,以及C:\<config-name>
在 Windows 容器中。
以下示例使用 short 语法向redis
服务
访问my_config
和my_other_config
configs 的 Configs。的值my_config
设置为文件的内容./my_config.txt
和my_other_config
定义为外部资源,这意味着它具有
已在平台中定义。如果外部配置不存在,
部署失败。
services:
redis:
image: redis:latest
configs:
- my_config
- my_other_config
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
长语法
long 语法为如何在服务的任务容器中创建配置提供了更精细的粒度。
source
:平台中存在的配置名称。target
:要挂载到服务的 任务容器。默认为/<source>
如果未指定。uid
和gid
:拥有挂载的配置文件的数字 UID 或 GID 在服务的任务容器中。未指定时的默认值为 USER running container。mode
:挂载在服务的 任务容器,采用八进制表示法。默认值为世界可读 (0444
). 必须忽略可写位。可执行位可以设置。
以下示例将my_config
自redis_config
在
container,将 mode 设置为0440
(组可读)并设置用户和组
自103
.这redis
服务无权访问my_other_config
config。
services:
redis:
image: redis:latest
configs:
- source: my_config
target: /redis_config
uid: "103"
gid: "103"
mode: 0440
configs:
my_config:
external: true
my_other_config:
external: true
container_name
container_name
是一个字符串,用于指定自定义容器名称,而不是默认生成的名称。
container_name: my-web-container
如果 Compose 文件指定了container_name
.尝试这样做会导致错误。
container_name
遵循[a-zA-Z0-9][a-zA-Z0-9_.-]+
credential_spec
credential_spec
配置 Managed Service 账户的凭证规范。
如果您有使用 Windows 容器的服务,则可以使用file:
和registry:
的协议credential_spec
.Compose 还支持其他
协议。
这credential_spec
必须采用file://<filename>
或registry://<value-name>
.
credential_spec:
file: my-credential-spec.json
使用registry:
,则凭证规范是从 Windows 注册表中读取的
守护程序的主机。具有给定名称的注册表值必须位于:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs
以下示例从名为my-credential-spec
在注册表中:
credential_spec:
registry: my-credential-spec
gMSA 配置示例
为服务配置 gMSA 凭证规范时,您只需要
要使用config
,如以下示例所示:
services:
myservice:
image: myimage:latest
credential_spec:
config: my_credential_spec
configs:
my_credentials_spec:
file: ./my-credential-spec.json|
depends_on
使用depends_on
属性,您可以控制服务启动和关闭的顺序。如果服务紧密耦合,并且启动顺序会影响应用程序的功能,则此功能非常有用。
短语法
短语法变体仅指定依赖项的服务名称。 服务依赖关系会导致以下行为:
Compose 按依赖项顺序创建服务。在以下 例
db
和redis
创建时间web
.Compose 会按依赖关系顺序删除服务。在以下 例
web
之前已删除db
和redis
.
简单示例:
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
Compose 保证依赖项服务之前已启动 启动依赖服务。 Compose 会等待依赖项服务“准备就绪”,然后再 启动依赖服务。
长语法
长格式语法支持配置不能 以简短的形式表示。
restart
:设置为true
Compose 会在更新依赖项服务后重新启动此服务。 这适用于由 Compose作控制的显式重启,但不包括容器运行时的自动重启 容器死机后。在 Docker Compose 版本 2.17.0 中引入。condition
:设置被视为满足依赖项的条件service_started
:相当于上述短语法service_healthy
:指定依赖项应为“正常” (如 healthcheck 所示)在启动依赖项之前 服务。service_completed_successfully
:指定依赖项应运行 成功完成,然后再启动依赖服务。
required
:设置为false
Compose 仅在 Dependency Service 未启动或不可用时发出警告。如果未定义 默认值required
是true
.在 Docker Compose 版本 2.20.0 中引入。
服务依赖关系会导致以下行为:
Compose 按依赖项顺序创建服务。在以下 例
db
和redis
创建时间web
.Compose 等待 healthchecks 传递依赖项 标有
service_healthy
.在以下示例中,db
预计 之前是“健康”web
已创建。Compose 会按依赖关系顺序删除服务。在以下 例
web
之前已删除db
和redis
.
services:
web:
build: .
depends_on:
db:
condition: service_healthy
restart: true
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
Compose 保证依赖项服务在
启动依赖服务。
Compose 保证标有service_healthy
在 “healthy” 之前。
部署
deploy
指定服务的部署和生命周期的配置,如 Compose Deploy 规范中所定义。
发展
develop
指定用于保持容器与 source 同步的开发配置,如 Development 部分所定义。
device_cgroup_rules
device_cgroup_rules
定义此容器的设备 cgroup 规则列表。
该格式与 Linux 内核在 Control Groups 中指定的格式相同
设备白名单控制器。
device_cgroup_rules:
- 'c 1:3 mr'
- 'a 7:* rmw'
设备
devices
以HOST_PATH:CONTAINER_PATH[:CGROUP_PERMISSIONS]
.
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
- "/dev/sda:/dev/xvda:rwm"
DNS (DNS)
dns
定义要在容器网络接口配置上设置的自定义 DNS 服务器。它可以是单个值或列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
dns_opt
dns_opt
列出要传递给容器的 DNS 解析器的自定义 DNS 选项(/etc/resolv.conf
文件)。
dns_opt:
- use-vc
- no-tld-query
dns_search
dns_search
定义要在容器网络接口配置上设置的自定义 DNS 搜索域。它可以是单个值或列表。
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
域名
domainname
声明要用于服务容器的自定义域名。它必须是有效的 RFC 1123 主机名。
driver_opts
driver_opts
将选项列表指定为要传递给驱动程序的键值对。这些选项包括
取决于驱动程序。
services:
app:
networks:
app_net:
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
有关更多信息,请参阅网络驱动程序文档。
入口点
entrypoint
声明服务容器的默认入口点。
这会覆盖ENTRYPOINT
指令。
如果entrypoint
为非 null,则 Compose 会忽略镜像中的任何默认命令,例如CMD
指令。
另请参阅command
设置或覆盖 EntryPoint 进程要执行的默认命令。
在其简短形式中,该值可以定义为字符串:
entrypoint: /code/entrypoint.sh
或者,该值也可以是列表,其方式类似于 Dockerfile:
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
如果值为null
,则使用镜像中的默认入口点。
如果值为 (empty list) 或 (empty string),则忽略镜像声明的默认入口点,
即 overridden 为空。[]
''
env_file
这env_file
属性用于指定一个或多个文件,这些文件包含要传递给容器的环境变量。
env_file: .env
相对路径是从 Compose 文件的父文件夹解析的。由于绝对路径会阻止 Compose
文件,则 Compose 会在使用此类路径设置env_file
.
在 environment 部分中声明的环境变量将覆盖这些值。即使这些值为 空或未定义。
env_file
也可以是列表。列表中的文件是自上而下处理的。对于同一变量
在两个 env 文件中指定,则列表中最后一个文件的值保持不变。
env_file:
- ./a.env
- ./b.env
List 元素也可以声明为 Map,然后允许您设置额外的 属性。
必填
这required
属性默认为true
.什么时候required
设置为false
和.env
文件缺失,则 Compose 会静默忽略该条目。
env_file:
- path: ./default.env
required: true # default
- path: ./override.env
required: false
格式
这format
属性允许您使用env_file
.未设置时,env_file
根据 Env_file 格式概述的 Compose 规则进行解析。
raw
format 允许您使用env_file
替换为 key=value 项,但 Compose 不会尝试解析值以进行插值。
这样,您就可以按原样传递值,包括引号和符号。$
env_file:
- path: ./default.env
format: raw
Env_file 格式
每 个.env
文件必须位于VAR[=[VAL]]
格式。以下语法规则适用:
- 以 开头的行将作为注释处理并忽略。
#
- 空行将被忽略。
- 未加引号和双引号的 () 值应用了 Interpolation。
"
- 每行表示一个键值对。值可以选择引用。
VAR=VAL
->VAL
VAR="VAL"
->VAL
VAR='VAL'
->VAL
- 未加引号的值的内联注释前面必须有空格。
VAR=VAL # comment
->VAL
VAR=VAL# not a comment
->VAL# not a comment
- 带引号的值的内联注释必须跟在结束引号后面。
VAR="VAL # not a comment"
->VAL # not a comment
VAR="VAL" # comment
->VAL
- 单引号 () 值按字面意思使用。
'
VAR='$OTHER'
->$OTHER
VAR='${OTHER}'
->${OTHER}
- 引号可以用 .
\
VAR='Let\'s go!'
->Let's go!
VAR="{\"hello\": \"json\"}"
->{"hello": "json"}
- 常见的 shell 转义序列包括
\n
,\r
,\t
,并且支持双引号值。\\
VAR="some\tvalue"
->some value
VAR='some\tvalue'
->some\tvalue
VAR=some\tvalue
->some\tvalue
VAL
可以省略,在这种情况下,变量 value 为空字符串。=VAL
可以省略,在这种情况下,变量为 unset。
# Set Rails/Rack environment
RACK_ENV=development
VAR="quoted"
环境
这environment
attribute 定义容器中设置的环境变量。environment
可以使用数组或
地图。任何布尔值;true、false、yes、no 应括在引号中以确保
YAML 解析器不会将它们转换为 True 或 False。
环境变量可以由单个键声明(没有值到等号)。在本例中,使用 Compose 依赖于您解析该值。如果该值未解析,则变量 未设置,并从 Service Container 环境中删除。
Map 语法:
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
数组语法:
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT
当两者env_file
和environment
为服务设置,值由environment
具有优先权。
暴露
expose
定义 Compose 从容器公开的(传入)端口或端口范围。这些端口必须是
可供链接服务访问,并且不应将其发布到主机。仅内部容器
可以指定端口。
语法为<portnum>/[<proto>]
或<startport-endport>/[<proto>]
对于端口范围。
如果未显式设置,则tcp
protocol 的
expose:
- "3000"
- "8000"
- "8080-8085/tcp"
注意
如果镜像的 Dockerfile 已经公开了端口,则即使
expose
未在 Compose 文件中设置。
延伸
extends
允许您在不同的文件之间共享通用配置,甚至完全共享不同的项目。跟extends
您可以在一个位置定义一组通用的服务选项,并从任何位置引用它。您可以引用另一个 Compose 文件,并选择您也想在自己的应用程序中使用的服务,并能够根据自己的需要覆盖某些属性。
您可以使用extends
与其他 Configuration Key 一起在任何服务上。这extends
value 必须是 Map
使用必需的service
和可选的file
钥匙。
extends:
file: common.yml
service: webapp
service
:定义作为基础引用的服务的名称,例如web
或database
.file
:定义该服务的 Compose 配置文件的位置。
当服务使用extends
,它还可以指定对其他资源的依赖关系,显式volumes
声明。但是,请务必注意extends
不会自动将目标卷定义合并到扩展的 Compose 文件中。相反,您负责确保为正在扩展的服务提供等效资源以保持一致性。Docker Compose 会验证 Compose 模型中是否存在具有引用 ID 的资源。
对extends
目标可以是:
- 显式引用
volumes
,networks
,configs
,secrets
,links
,volumes_from
或depends_on
- 使用
service:{name}
命名空间声明中的语法 (ipc
,pid
,network_mode
)
循环引用extends
不受支持,则 Compose 会在检测到错误时返回错误。
查找引用服务
file
值可以是:
- 不存在。 这表示正在引用同一 Compose 文件中的另一个服务。
- 文件路径,可以是:
- 相对路径。此路径被视为相对于主 Compose 的位置 文件。
- 绝对路径。
由service
必须存在于已识别的引用 Compose 文件中。
如果出现以下情况,Compose 会返回错误:
- 由
service
未找到。 - 由
file
未找到。
合并服务定义
两个服务定义,当前 Compose 文件中的主定义和引用的服务定义
指定者extends
的 ID 将按以下方式合并:
- Mappings:主服务定义的 mapping 中的键覆盖 mapping 中的键 引用的服务定义。未覆盖的键将按原样包含。
- 序列:项目组合成一个新序列。元素的顺序是 保留,引用的项目在前,主项目在后。
- 标量:主服务定义中的键优先于 引用了一个。
映射
以下键应被视为映射:annotations
,build.args
,build.labels
,build.extra_hosts
,deploy.labels
,deploy.update_config
,deploy.rollback_config
,deploy.restart_policy
,deploy.resources.limits
,environment
,healthcheck
,labels
,logging.options
,sysctls
,storage_opt
,extra_hosts
,ulimits
.
一个例外情况适用于healthcheck
是主映射无法指定disable: true
除非引用的映射还指定了disable: true
.在这种情况下,Compose 会返回错误。
例如,下面的输入:
services:
common:
image: busybox
environment:
TZ: utc
PORT: 80
cli:
extends:
service: common
environment:
PORT: 8080
为cli
服务。相同的输出是
如果使用数组语法,则生成。
environment:
PORT: 8080
TZ: utc
image: busybox
下 项blkio_config.device_read_bps
,blkio_config.device_read_iops
,blkio_config.device_write_bps
,blkio_config.device_write_iops
,devices
和volumes
也被视为映射,其中 key 是
容器。
例如,下面的输入:
services:
common:
image: busybox
volumes:
- common-volume:/var/lib/backup/data:rw
cli:
extends:
service: common
volumes:
- cli-volume:/var/lib/backup/data:ro
为cli
服务。请注意,挂载的路径
现在指向新的卷名称,并且ro
标志。
image: busybox
volumes:
- cli-volume:/var/lib/backup/data:ro
如果引用的服务定义包含extends
mapping 的
只需复制到新的合并定义中。然后启动合并过程
再次关闭直到没有extends
键剩余。
例如,下面的输入:
services:
base:
image: busybox
user: root
common:
image: busybox
extends:
service: base
cli:
extends:
service: common
为cli
服务。这里cli
服务业
得到user
密钥来自common
service,而 service 又从base
服务。
image: busybox
user: root
序列
以下键应被视为序列:cap_add
,cap_drop
,configs
,deploy.placement.constraints
,deploy.placement.preferences
,deploy.reservations.generic_resources
,device_cgroup_rules
,expose
,external_links
,ports
,secrets
,security_opt
.
将删除合并产生的任何重复项,以便仅序列
包含唯一元素。
例如,下面的输入:
services:
common:
image: busybox
security_opt:
- label:role:ROLE
cli:
extends:
service: common
security_opt:
- label:user:USER
为cli
服务。
image: busybox
security_opt:
- label:role:ROLE
- label:user:USER
如果使用 case list 语法,则以下键也应被视为序列:dns
,dns_search
,env_file
,tmpfs
.与上面提到的序列字段不同,
不会删除合并产生的重复项。
标量
服务定义中允许的任何其他键都应被视为标量。
external_links
external_links
将服务容器链接到在 Compose 应用程序外部托管的服务。external_links
定义要使用 Platform Lookup 机制检索的现有服务的名称。
形式的别名SERVICE:ALIAS
可以指定。
external_links:
- redis
- database:mysql
- database:postgresql
extra_hosts
extra_hosts
将主机名映射添加到容器网络接口配置 (/etc/hosts
适用于 Linux)。
短语法
短语法在列表中使用纯字符串。值必须以HOSTNAME=IP
.
extra_hosts:
- "somehost=162.242.195.82"
- "otherhost=50.31.209.229"
- "myhostv6=::1"
IPv6 地址可以括在方括号中,例如:
extra_hosts:
- "myhostv6=[::1]"
separator 是首选,但=
:
也可以使用。在 Docker Compose 版本 2.24.1 中引入。例如:
extra_hosts:
- "somehost:162.242.195.82"
- "myhostv6:::1"
长语法
或者extra_hosts
可以设置为主机名和 IP 之间的映射
extra_hosts:
somehost: "162.242.195.82"
otherhost: "50.31.209.229"
myhostv6: "::1"
Compose 会在容器的网络中创建一个具有 IP 地址和主机名的匹配条目
configuration,这意味着对于 Linux/etc/hosts
获取额外行:
162.242.195.82 somehost
50.31.209.229 otherhost
::1 myhostv6
group_add
group_add
按名称或编号指定其他组,容器内的用户必须是该组的成员。
例如,当多个容器(以不同用户身份运行)需要全部读取或写入时,这非常有用
共享卷上的同一文件。该文件可以由所有容器共享的组拥有,并在group_add
.
services:
myservice:
image: alpine
group_add:
- mail
运行id
在创建的容器内必须显示用户属于mail
group 中,则不会有
如果group_add
没有宣布。
健康检查
这healthcheck
属性声明一项检查,该检查用于确定服务容器是否“运行状况良好”。它的工作方式与 HEALTHCHECK Dockerfile 指令相同,并且具有相同的默认值
由服务的 Docker 镜像设置。您的 Compose 文件可以覆盖 Dockerfile 中设置的值。
有关更多信息HEALTHCHECK
,请参阅 Dockerfile 参考。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
start_interval: 5s
interval
,timeout
,start_period
和start_interval
指定为 durations。在 Docker Compose 版本 2.20.2 中引入
test
定义 Compose 运行以检查容器运行状况的命令。可以是
字符串或列表。如果它是一个列表,则第一项必须是NONE
,CMD
或CMD-SHELL
.
如果它是一个字符串,则等效于指定CMD-SHELL
后跟该字符串。
# Hit the local web app
test: ["CMD", "curl", "-f", "http://localhost"]
用CMD-SHELL
使用容器的默认 shell 运行配置为字符串的命令
(/bin/sh
适用于 Linux)。以下两种形式是等效的:
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
test: curl -f https://localhost || exit 1
NONE
禁用 healthcheck,主要用于禁用服务的 Docker 镜像设置的 Healthcheck Dockerfile 指令。或者
镜像设置的 HealthCheck 可以通过设置disable: true
:
healthcheck:
disable: true
主机名
hostname
声明用于服务容器的自定义主机名。它必须是有效的 RFC 1123 主机名。
镜像
image
指定要从中启动容器的镜像。image
必须遵循 Open Container Specification 可寻址镜像格式,
如[<registry>/][<project>/]<image>[:<tag>|@<digest>]
.
image: redis
image: redis:5
image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis
如果平台上不存在该镜像,Compose 会尝试根据pull_policy
.
如果您还使用 Compose Build Specification,则还有其他选项可用于控制
pull over 从 source 构建镜像,但 pull the image 是默认行为。
image
可以从 Compose 文件中省略,只要build
部分。如果您未使用 Compose 构建规范,则 Compose 在以下情况下将无法正常工作image
Compose 文件中缺少。
初始化
init
在容器内运行一个 init 进程 (PID 1),该进程转发 signals 并 reaps 进程。
将此选项设置为true
为服务启用此功能。
services:
web:
image: alpine:latest
init: true
使用的 init Binaries是特定于平台的。
工控机
ipc
配置 Service Container 设置的 IPC 隔离模式。
shareable
:为容器提供自己的私有 IPC 命名空间,其中包含 可以与其他容器共享。service:{name}
:使容器加入另一个容器的 (shareable
) IPC 命名空间。
ipc: "shareable"
ipc: "service:[service name]"
隔离
isolation
指定容器的隔离技术。支持的值特定于平台。
标签
labels
将元数据添加到容器。您可以使用数组或映射。
建议您使用反向 DNS 表示法来防止标签与 其他软件使用的设备。
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
Compose 会创建具有规范标签的容器:
com.docker.compose.project
set 设置为 Compose 创建的所有资源的用户项目名称com.docker.compose.service
在 Compose 文件中定义的服务名称的服务容器上设置
这com.docker.compose
label prefix 被保留。在 Compose 文件中指定带有此前缀的标签
导致运行时错误。
链接
links
定义指向其他服务中的容器的网络链接。请同时指定服务名称和
链接别名 (SERVICE:ALIAS
),或者只使用服务名称。
web:
links:
- db
- db:database
- redis
链接服务的容器可通过与别名或服务名称相同的主机名访问 如果未指定别名。
不需要链接即可使服务进行通信。如果未设置特定的网络配置,
任何服务都能够访问default
网络。如果服务
声明它们所附加到的网络,links
不会覆盖网络配置和服务
连接到共享网络时无法通信。Compose 不会在配置不匹配时发出警告。
链接还以与 depends_on 相同的方式表示服务之间的隐式依赖关系,因此它们确定服务启动的顺序。
伐木
logging
定义服务的日志记录配置。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
这driver
name 指定服务容器的日志记录驱动程序。默认值和可用值
特定于平台。驱动程序特定的选项可以使用options
作为键值对。
mac_address
适用于 Docker Compose 版本 2.24.0 及更高版本。
mac_address
设置服务容器的 MAC 地址。
注意
容器运行时可能会拒绝此值(即。Docker 引擎 >= v25.0)。在这种情况下,您应该改用 networks.mac_address。
mem_limit
mem_limit
配置容器可以分配的内存量的限制,设置为表示字节值的字符串。
设置后,mem_limit
必须与limits.memory
属性。
mem_reservation
mem_reservation
配置容器可以分配的内存量的预留,设置为表示字节值的字符串。
设置后,mem_reservation
必须与reservations.memory
属性。
mem_swappiness
mem_swappiness
定义为一个百分比,一个介于 0 和 100 之间的值,供主机内核换出
容器使用的匿名内存页。
0
:关闭匿名页面交换。100
:将所有匿名页面设置为可交换页面。
默认值是特定于平台的。
memswap_limit
memswap_limit
定义允许容器交换到磁盘的内存量。这是一个修饰符
属性,该属性仅在memory
。使用 swap 可以让容器写入多余的
内存要求。
经常将内存交换到磁盘的应用程序会降低性能。
- 如果
memswap_limit
设置为正整数,则memory
和memswap_limit
必须设置。memswap_limit
表示可以使用的内存和 swap 的总量,并且memory
控制非交换内存使用的数量。因此,如果memory
=“300m” 和memswap_limit
=“1g”,容器可以使用 300m 的内存和 700m (1g - 300m) 的交换空间。 - 如果
memswap_limit
设置为 0,则忽略该设置,并将该值视为未设置。 - 如果
memswap_limit
设置为与memory
和memory
设置为正整数,则容器无权访问 swap。 - 如果
memswap_limit
未设置,并且memory
设置后,容器可以使用与memory
设置,如果主机容器配置了交换内存。例如,如果memory
=“300m” 和memswap_limit
未设置,则容器总共可以使用 600m 的内存和 swap。 - 如果
memswap_limit
显式设置为 -1,则允许容器使用无限交换,最高可达主机系统上的可用数量。
network_mode
network_mode
设置 Service Container 的网络模式。
none
:关闭所有容器联网。host
:为容器提供对主机网络接口的原始访问权限。service:{name}
:通过引用容器的服务名称,为容器提供对指定容器的访问权限。container:{name}
:通过引用容器的容器 ID 为容器提供对指定容器的访问权限。
有关容器网络的更多信息,请参阅 Docker Engine 文档。
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
设置后,networks
属性,并且 Compose 会拒绝任何
Compose 文件。
网络
这networks
属性定义服务容器所附加到的网络,引用networks
top-level 元素。这networks
属性有助于管理容器的网络方面,从而控制服务在 Docker 环境中的分段和交互方式。这用于指定该服务的容器应连接到哪些网络。这对于定义容器如何相互通信以及如何进行外部通信非常重要。
services:
some-service:
networks:
- some-network
- other-network
有关networks
顶级元素,请参阅 网络。
别名
aliases
声明网络上服务的备用主机名。同一台上的其他容器
network 可以使用服务名称或别名连接到服务的容器之一。
因为aliases
是网络范围的,则同一服务可以在不同的网络上具有不同的别名。
注意
网络范围的别名可以由多个容器共享,甚至可以由多个服务共享。 如果是,则无法保证名称解析为哪个容器。
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
在以下示例中,servicefrontend
能够到达backend
service 在
主机名backend
或database
在back-tier
网络。服务monitoring
能够达到相同的backend
service 在backend
或mysql
在admin
网络。
services:
frontend:
image: example/webapp
networks:
- front-tier
- back-tier
monitoring:
image: example/monitoring
networks:
- admin
backend:
image: example/backend
networks:
back-tier:
aliases:
- database
admin:
aliases:
- mysql
networks:
front-tier:
back-tier:
admin:
ipv4_address、ipv6_address
在加入网络时为服务容器指定静态 IP 地址。
顶级 networks 部分中的相应网络配置必须具有ipam
属性,其中包含涵盖每个静态地址的子网配置。
services:
frontend:
image: example/webapp
networks:
front-tier:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
front-tier:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "2001:3984:3989::/64"
link_local_ips
link_local_ips
指定链路本地 IP 的列表。链路本地 IP 是属于井的特殊 IP
已知子网,完全由 Operator 管理,通常取决于它们所在的架构
部署。
例:
services:
app:
image: busybox
command: top
networks:
app_net:
link_local_ips:
- 57.123.22.11
- 57.123.22.13
networks:
app_net:
driver: bridge
mac_address
mac_address
设置服务容器在连接到此特定网络时使用的 MAC 地址。
优先权
priority
指示 Compose 将服务的容器连接到其
网络。如果未指定,则默认值为 0。
在以下示例中,应用服务连接到app_net_1
首先,因为它具有最高优先级。然后它连接到app_net_3
然后app_net_2
,它使用默认优先级值 0。
services:
app:
image: busybox
command: top
networks:
app_net_1:
priority: 1000
app_net_2:
app_net_3:
priority: 100
networks:
app_net_1:
app_net_2:
app_net_3:
oom_kill_disable
如果oom_kill_disable
时,Compose 会配置平台,使其不会在
的记忆匮乏。
oom_score_adj
oom_score_adj
调整在内存不足时由 Platform 终止的容器的首选项。值必须
在 -1000,1000 范围内。
PID
pid
设置 Compose 创建的容器的 PID 模式。
支持的值特定于平台。
pids_limit
pids_limit
调整容器的 PID 限制。设置为 -1 表示 PID 不受限制。
pids_limit: 10
设置后,pids_limit
必须与pids
属性。
平台
platform
定义运行服务的容器的目标平台。它使用os[/arch[/variant]]
语法。
的值os
,arch
和variant
必须符合 OCI 镜像规范使用的约定。
Compose 使用此属性来确定提取哪个版本的镜像 和/或执行服务构建的平台。
platform: darwin
platform: windows/amd64
platform: linux/arm64/v8
港口
这ports
用于定义主机和容器之间的端口映射。这对于允许外部访问容器内运行的服务至关重要。可以使用简单端口映射的短语法或长语法(包括协议类型和网络模式等其他选项)来定义它。
注意
端口映射不得与
network_mode: host
否则会发生运行时错误。
短语法
短语法是一个以冒号分隔的字符串,用于设置主机 IP、主机端口和容器端口 在表单中:
[HOST:]CONTAINER[/PROTOCOL]
哪里:
HOST
是[IP:](port | range)
CONTAINER
是port | range
PROTOCOL
将端口限制为指定的协议。tcp
和udp
值由规范定义, Compose 支持特定于平台的协议名称。
如果未设置主机 IP,它将绑定到所有网络接口。端口可以是单个 值或范围。Host 和容器必须使用等效的范围。
指定两个端口 (HOST:CONTAINER
),或者只是容器端口。在后一种情况下,
容器运行时会自动分配主机的任何未分配端口。
HOST:CONTAINER
应始终指定为(带引号的)字符串,以避免冲突
使用 YAML Base-60 浮点数。
例子:
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "8000-9000:80"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
注意
如果容器引擎不支持主机 IP 映射,则 Compose 会拒绝 Compose 文件并忽略指定的主机 IP。
长语法
长格式语法允许配置不能 以简短的形式表示。
target
:集装箱港口published
:公开暴露的端口。它定义为字符串,可以使用语法设置为范围start-end
.这意味着在设置的范围内为实际端口分配了剩余的可用端口。host_ip
:主机 IP 映射,未指定表示所有网络接口 (0.0.0.0
).protocol
:端口协议 (tcp
或udp
).默认为tcp
.app_protocol
此端口用于的应用程序协议(TCP/IP 级别 4 / OSI 级别 7)。这是可选的,可以用作 Compose 的提示,以便为它理解的协议提供更丰富的行为。在 Docker Compose 版本 2.26.0 中引入。mode
:host
:用于在每个节点上发布主机端口,或ingress
,以便对端口进行负载均衡。默认为ingress
.name
:端口的可读名称,用于记录它在服务中的使用情况。
ports:
- name: web
target: 80
host_ip: 127.0.0.1
published: "8080"
protocol: tcp
app_protocol: http
mode: host
- name: web-secured
target: 443
host_ip: 127.0.0.1
published: "8083-9000"
protocol: tcp
app_protocol: https
mode: host
post_start
post_start
定义在容器启动后运行的生命周期钩子序列。无法保证命令运行的确切时间。
command
:指定容器启动后要运行的命令。此属性是必需的,您可以选择使用 shell 表单或 exec 表单。user
:运行命令的用户。如果未设置,则使用与主服务命令相同的用户运行该命令。privileged
:让post_start
命令运行。working_dir
:运行命令的工作目录。如果未设置,它将在与 main service 命令相同的工作目录中运行。environment
:专门为post_start
命令。虽然该命令继承了为服务的 main 命令定义的环境变量,但此部分允许您添加新变量或覆盖现有变量。
services:
test:
post_start:
- command: ./do_something_on_startup.sh
user: root
privileged: true
environment:
- FOO=BAR
有关更多信息,请参阅使用生命周期挂钩。
pre_stop
pre_stop
定义在容器停止之前要运行的生命周期钩子序列。如果容器自行停止或突然终止,这些 hook 将不会运行。
配置等效于“post_start。
特权
privileged
将服务容器配置为使用提升的权限运行。支持和实际影响因平台而异。
配置 文件
profiles
定义要启用的服务的命名配置文件列表。如果未分配,则始终启动服务,但如果已分配,则仅在激活配置文件时启动该服务。
如果存在,则profiles
遵循[a-zA-Z0-9][a-zA-Z0-9_.-]+
.
services:
frontend:
image: frontend
profiles: ["frontend"]
phpmyadmin:
image: phpmyadmin
depends_on:
- db
profiles:
- debug
pull_policy
pull_policy
定义 Compose 在开始拉取镜像时做出的决策。可能的值为:
always
:Compose 始终从注册表中提取镜像。never
:Compose 不会从注册表中提取镜像,而是依赖于平台缓存的镜像。 如果没有缓存的镜像,则报告失败。missing
:仅当镜像在平台缓存中不可用时,Compose 才会提取镜像。 如果您未同时使用 Compose Build Specification,则此选项为默认选项。if_not_present
被视为此值的别名,以实现向后兼容性。build
:Compose 会构建镜像。如果镜像已存在,则 Compose 会重新构建该镜像。
read_only
read_only
将服务容器配置为使用只读文件系统创建。
重新启动
restart
定义平台在容器终止时应用的策略。
no
:默认重启策略。在任何情况下,它都不会重新启动容器。always
:该策略始终重新启动容器,直到将其删除。on-failure[:max-retries]
:如果退出代码指示错误,该策略将重新启动容器。 (可选)限制 Docker 守护程序尝试的重启重试次数。unless-stopped
:该策略会重新启动容器,而不管退出代码如何,但会停止 在服务停止或删除时重新启动。
restart: "no"
restart: always
restart: on-failure
restart: on-failure:3
restart: unless-stopped
您可以在 Docker 运行参考页面的重启策略 (--restart) 部分找到有关重启策略的更多详细信息。
运行
runtime
指定要用于服务容器的运行时。
例如runtime
可以是 OCI 运行时规范的实施名称,例如“runc”。
web:
image: busybox:latest
command: true
runtime: runc
默认值为runc
.要使用其他运行时,请参阅替代运行时。
规模
scale
指定要为此服务部署的默认容器数。
当两者都设置好时,scale
必须与replicas
属性。
秘密
这secrets
attribute 按服务授予对 secrets 顶级元素定义的敏感数据的访问权限。可以向服务授予对多个密钥的访问权限。
支持两种不同的语法变体;短语法和长语法。密钥的 long 和 short 语法可以在同一 Compose 文件中使用。
如果密钥在平台上不存在或未在secrets
顶级部分的 Compose 文件。
在顶级中定义密钥secrets
不得暗示授予对它的任何服务访问权限。
此类授权必须在服务规范中作为 secrets 服务元素显式指定。
短语法
短语法变体仅指定密钥名称。这将授予
容器访问密钥并将其作为只读挂载到/run/secrets/<secret_name>
在容器内。源名称和目标挂载点均已设置
添加到密钥名称。
以下示例使用 short 语法向frontend
服务
访问server-certificate
秘密。的值server-certificate
已设置
添加到文件内容./server.cert
.
services:
frontend:
image: example/webapp
secrets:
- server-certificate
secrets:
server-certificate:
file: ./server.cert
长语法
长语法为如何在 服务的容器。
source
:平台上存在的密钥的名称。target
:要挂载的文件的名称/run/secrets/
在 服务的任务容器,或者文件的绝对路径(如果需要备用位置)。默认为source
如果未指定。uid
和gid
:拥有其中文件的数字 UID 或 GID/run/secrets/
在服务的任务容器中。默认值为 USER running container。mode
:要挂载的文件的权限/run/secrets/
在服务的任务容器中,采用八进制表示法。 默认值为全局可读权限(模式0444
). 如果设置了 writable bit,则必须忽略该 writable bit 。可以设置可执行位。
以下示例将server-certificate
secret 文件设置为server.cert
在容器中,将 mode 设置为0440
(组可读),并设置用户和组
自103
.的值server-certificate
已设置
添加到文件内容./server.cert
.
services:
frontend:
image: example/webapp
secrets:
- source: server-certificate
target: server.cert
uid: "103"
gid: "103"
mode: "0440"
secrets:
server-certificate:
file: ./server.cert
security_opt
security_opt
覆盖每个容器的默认标记方案。
security_opt:
- label:user:USER
- label:role:ROLE
有关您可以覆盖的更多默认标记方案,请参阅安全配置。
shm_size
shm_size
配置共享内存的大小 (/dev/shm
分区)。
它被指定为字节值。
stdin_open
stdin_open
将服务的容器配置为使用分配的 stdin 运行。这与使用-i
旗。有关详细信息,请参阅 使 STDIN 保持打开状态。
支持的值包括true
或false
.
stop_grace_period
stop_grace_period
指定 Compose 在尝试停止容器时必须等待多长时间(如果未停止容器)
handle SIGTERM (或已指定的任何停止信号stop_signal
),然后再发送 SIGKILL。它被指定
作为持续时间。
stop_grace_period: 1s
stop_grace_period: 1m30s
默认值为 10 秒,以便容器在发送 SIGKILL 之前退出。
stop_signal
stop_signal
定义 Compose 用于停止服务容器的信号。
如果未设置的容器被 Compose 通过发送SIGTERM
.
stop_signal: SIGUSR1
storage_opt
storage_opt
定义服务的存储驱动程序选项。
storage_opt:
size: '1G'
sysctl 参数
sysctls
定义要在容器中设置的内核参数。sysctls
可以使用 array 或 map。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
您只能使用在内核中具有命名空间的 sysctl 参数。Docker 不会 支持更改容器内的 sysctl 参数,这些 sysctl 参数也会修改主机系统。 有关支持的 sysctl 的概述,请参阅配置命名空间内核 参数 (sysctl) 的 S 参数。
TMPFS
tmpfs
在容器内挂载临时文件系统。它可以是单个值或列表。
tmpfs:
- <path>
- <path>:<options>
:容器内将挂载 tmpfs 的路径。 :tmpfs 挂载的选项列表(以逗号分隔)。
可用选项:
mode
:设置文件系统权限。uid
:设置拥有已挂载 tmpfs 的用户 ID。gid
:设置拥有已挂载 tmpfs 的组 ID。
services:
app:
tmpfs:
- /data:mode=755,uid=1009,gid=1009
- /run
tty
tty
将服务的容器配置为使用 TTY 运行。这与使用-t
或--tty
旗。有关详细信息,请参阅分配伪 TTY。
支持的值包括true
或false
.
ulimits
ulimits
覆盖容器的默认 uLimit。它被指定为单个限制的整数
或作为软/硬限制的映射。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
用户
user
覆盖用于运行容器进程的用户。默认值由镜像(即 DockerfileUSER
).如果未设置,则root
.
userns_mode
userns_mode
设置服务的用户命名空间。支持的值特定于平台,可能取决于
在平台配置上。
userns_mode: "host"
UTS
uts
配置服务容器的 UTS 命名空间模式集。未指定时
如果支持,则由运行时决定分配 UTS 命名空间。可用值为:
'host'
:导致容器使用与主机相同的 UTS 命名空间。
uts: "host"
卷
这volumes
属性定义服务容器可访问的挂载主机路径或命名卷。您可以使用volumes
定义多种类型的挂载;volume
,bind
,tmpfs
或npipe
.
如果挂载是主机路径,并且仅由单个服务使用,则可以将其声明为服务的一部分
定义。要跨多个服务重用卷,请创建一个名为
volume 必须在volumes
top-level 元素。
以下示例显示了一个命名卷 (db-data
) 被backend
服务
以及为单个服务定义的绑定挂载。
services:
backend:
image: example/backend
volumes:
- type: volume
source: db-data
target: /data
volume:
nocopy: true
subpath: sub
- type: bind
source: /var/run/postgres/postgres.sock
target: /var/run/postgres/postgres.sock
volumes:
db-data:
有关volumes
顶级元素,请参阅 卷。
短语法
短语法使用带有冒号分隔值的单个字符串来指定卷挂载
(VOLUME:CONTAINER_PATH
) 或访问模式 (VOLUME:CONTAINER_PATH:ACCESS_MODE
).
VOLUME
:可以是托管容器的平台上的主机路径(绑定挂载)或卷名称。CONTAINER_PATH
:容器中挂载卷的路径。ACCESS_MODE
:逗号分隔,
选项列表:rw
:读取和写入访问权限。如果未指定任何内容,则为默认值。ro
:只读访问权限。z
: SELinux 选项,指示绑定挂载主机内容在多个容器之间共享。Z
:SELinux 选项,指示绑定挂载主机内容是私有的,并且对于其他容器是非共享的。
注意
在没有 SELinux 的平台上,将忽略 SELinux 重新标记绑定挂载选项。
注意
只有部署到 本地容器运行时。这是因为相对路径是从 Compose 文件的父级解析的 目录,该目录仅适用于本地情况。当 Compose 部署到非本地 platform 拒绝使用相对主机路径的 Compose 文件,但会出现错误。为避免歧义 对于命名卷,相对路径应始终以
.
或..
.
长语法
长格式语法允许配置不能 以简短的形式表示。
type
:挂载类型。也volume
,bind
,tmpfs
,npipe
或cluster
source
:挂载的源、绑定挂载在主机上的路径或 在顶级volumes
钥匙.不适用于 tmpfs 挂载。target
:容器中挂载卷的路径。read_only
:标记以将卷设置为只读。bind
:用于配置其他绑定选项:propagation
:用于绑定的传播模式。create_host_path
:如果不存在任何内容,则在 host 上的源路径处创建一个目录。 如果路径中存在任何内容,则 Compose 不会执行任何作。这由简短的语法自动暗示 为了向后兼容docker-compose
遗产。selinux
:SELinux 重新标记选项z
(共享) 或Z
(私人)
volume
:配置其他卷选项:nocopy
:此标记可在创建卷时禁用从容器复制数据。subpath
:卷中要挂载的路径,而不是卷根目录。
tmpfs
:配置其他 tmpfs 选项:size
:tmpfs 挂载的大小,以字节为单位(数字或字节单位)。mode
:tmpfs 的文件模式作为八进制数的 Unix 权限位挂载。在 Docker Compose 版本 2.14.0 中引入。
consistency
:挂载的一致性要求。可用值特定于平台。
提示
使用大型存储库或 monorepo,或者使用不再随代码库扩展的虚拟文件系统? Compose 现在利用同步文件共享,并自动为绑定挂载创建文件共享。 确保您已使用付费订阅登录到 Docker,并且已在 Docker Desktop 的设置中启用了 Access experimental features 和 Manage Synchronized file shares with Compose。
volumes_from
volumes_from
挂载来自其他服务或容器的所有卷。您可以选择指定
只读访问ro
或读写rw
.如果未指定访问级别,则使用读写访问权限。
您还可以使用container:
前缀。
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
working_dir
working_dir
覆盖由镜像指定的容器工作目录,例如 Dockerfile 的WORKDIR
.