版本2 | Version 2 (Compose)
Compose 文件版本2参考
参考和指导
这些主题描述 Compose 文件格式的第2版。
Compose 和 Docker 兼容性矩阵
有几种版本的 Compose 文件格式 - 1,2,2.x 和3.x 下面的表格是一个快速的样子。有关每个版本包含的内容以及如何升级的完整详细信息,请参阅关于版本和升级
。
此表显示哪些 Compose 文件版本支持特定的 Docker 版本。
Compose file format | Docker Engine release |
---|---|
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
1.0 | 1.9.1.+ |
除了表格中显示的 Compose 文件格式版本外,Compose 本身也处于发布日程安排中,如 Compose 发行版中所示,但文件格式版本不一定随每个发行版而增加。例如,Compose 文件格式3.0首先在 Compose 版本1.10.0中引入,并在随后的版本中逐步版本化。
服务配置参考
Compose 文件是一个定义服务,网络和卷的 YAML 文件。Compose 文件的默认路径是./docker-compose.yml
。
提示
:您可以对此文件使用.yml
或.yaml
扩展名。他们都工作。
容器定义包含到每个容器启动用于该服务,很像传递命令行参数来将被应用的配置docker run
。同样,网络和卷的定义类似于docker network create
和docker volume create
。
正如docker run
在 Dockerfile 指定选项(例如,CMD
,EXPOSE
,VOLUME
,ENV
)是默认的-你不需要再次指定它们docker-compose.yml
。
您可以使用类 Bash ${VARIABLE}
语法在配置值中使用环境变量- 有关完整详细信息,请参阅变量替换。
本节包含版本2中服务定义所支持的所有配置选项的列表。
blkio_config
用于为此服务设置块 IO 限制的一组配置选项。
version: '2.2'
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
,为受影响的设备定义符号路径
device_read_iops, device_write_iops
为给定设备上的读/写操作设置每秒操作的限制。列表中的每个项目必须有两个键:
path
,为受影响的设备定义符号路径
weight
修改分配给该服务的带宽相对于其他服务的比例。采用10到1000之间的整数值,其中500是默认值。
weight_device
微调设备的带宽分配。列表中的每个项目必须有两个键:
path
,为受影响的设备定义符号路径
build
在构建时应用的配置选项。
build
可以指定为包含构建上下文的路径的字符串,也可以指定具有在上下文中指定的路径的对象,也可以指定 dockerfile 和
args。
build: ./dir
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
如果指定image
以及build
,然后撰写的名称与内置的图像webapp
和可选的tag
规定image
:
build: ./dir
image: webapp:tag
这将产生一个名为webapp
和标记的图像,由此tag
构建而成./dir
。
context
版本2文件格式和在版本1中,只需使用 build。
可以是包含 Dockerfile 的目录的路径,也可以是到 git 存储库的 URL。
当提供的值是相对路径时,它被解释为相对于撰写文件的位置。这个目录也是发送到 Docker 守护进程的构建上下文。
撰写将使用生成的名称进行构建和标记,然后使用该图像。
build:
context: ./dir
dockerfile
备用 Dockerfile。
撰写将使用替代文件来构建。还必须指定构建路径。
build:
context: .
dockerfile: Dockerfile-alternate
args
版本2文件格式。
添加构建参数,这些参数是仅在构建过程中可访问的环境变量。
首先,在 Dockerfile 中指定参数:
ARG buildno
ARG password
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
然后指定build
键下的参数。您可以传递映射或列表:
build:
context: .
args:
buildno: 1
password: secret
build:
context: .
args:
- buildno=1
- password=secret
指定构建参数时可以省略该值,在这种情况下,构建时的值是 Compose 运行环境中的值。
args:
- buildno
- password
注
:YAML 布尔值(true
,false
,yes
,no
,on
,off
)必须用引号括起来,这样分析器会将它们解释为字符串。
labels
添加了2.1版文件格式
使用 Docker 标签将元数据添加到生成的图像。您可以使用数组或字典。
建议您使用反向 DNS 标记来防止您的标签与其他软件使用的标签冲突。
build:
context: .
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
build:
context: .
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
network
在2.2版文件格式中添加
设置网络容器将RUN
在构建期间连接到指令。
build:
context: .
network: host
build:
context: .
network: custom_network_1
target
在2.3版本文件格式中添加
根据定义的内部构建指定的舞台Dockerfile
。有关详细信息,请参阅多阶段构建文档。
build:
context: .
target: prod
cap_add, cap_drop
添加或删除容器功能。请参阅man 7 capabilities
完整列表。
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
command
覆盖默认命令。
command: bundle exec thin -p 3000
该命令也可以是一个列表,方式类似于 dockerfile:
command: ["bundle", "exec", "thin", "-p", "3000"]
cgroup_parent
为容器指定一个可选的父 cgroup。
cgroup_parent: m-executor-abcd
container_name
指定一个自定义容器名称,而不是生成的默认名称。
container_name: my-web-container
由于 Docker 容器名称必须是唯一的,因此如果您指定了自定义名称,则无法将服务扩展到1个容器之外。试图这样做会导致错误。
devices
设备映射列表。使用与--device
Docker 客户端创建选项相同的格式。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
depends_on
版本2文件格式。
服务之间的快速依赖关系,这有两个影响:
docker-compose up
将以依赖性顺序启动服务。在下面的例子中,db
并且redis
会在之前启动web
。
简单的例子:
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意
:在开始之前,depends_on
不会等待db
并redis
“准备好”web
- 直到它们开始。如果您需要等待服务准备就绪,请参阅控制启动顺序以了解有关此问题的更多信息以及解决此问题的策略。添加了2.1版文件格式。
运行状况检查表明,您希望依赖性在启动之前等待另一个容器“健康”(即其健康检查广告成功状态)。
例:
version: '2.1'
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
redis:
image: redis
db:
image: redis
healthcheck:
test: "exit 0"
在上面的例子中,Compose 将redis
在开始之前等待服务启动(传统行为)和db
服务健康web
。
有关补充信息,请参阅 healthcheck 部分。
dns
自定义 DNS 服务器。可以是单个值或列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
dns_opt
要添加到容器的 resolv.conf 文件的自定义DNS选项列表。
dns_opt:
- use-vc
- no-tld-query
dns_search
自定义DNS搜索域。可以是单个值或列表。
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
tmpfs
在容器内安装临时文件系统。可以是单个值或列表。
tmpfs: /run
tmpfs:
- /run
- /tmp
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
注意:设置入口点将覆盖使用ENTRYPOINT Dockerfile指令在服务图像上设置的任何默认入口点,并清除图像上的任何默认命令 - 这意味着如果Dockerfile中有CMD指令,它将被忽略。
env_file
Add environment variables from a file. Can be a single value or a list.
如果已使用 docker-compose -f FILE 指定了 Compose 文件,则 env_file 中的路径相对于该文件所在的目录
在环境部分中声明的环境变量会覆盖这些值 - 即使这些值为空或未定义,这也适用。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
Compose 期望 env 文件中的每一行都是 VAR = VAL 格式。以#开头的行(即注释)将被忽略,空行也将被忽略。
# Set Rails/Rack environment
RACK_ENV=development
注意:如果您的服务指定了构建选项,则在构建期间,环境文件中定义的变量将不会自动显示。使用 build 的 args 子选项来定义构建时环境变量。
VAL 的值按原样使用,不进行修改。例如,如果值由引号括起(通常是 shell 变量的情况),则引号将包含在传递给 Compose 的值中。
请记住,列表中文件的顺序对于确定分配给多次显示的变量的值非常重要。列表中的文件从上到下进行处理。对于文件 a.env 中指定的相同变量,并在文件 b.env 中指定了不同的值,如果 b.env 列在下面(后面),则 b.env 中的值表示。例如,在 docker_compose.yml 中给出以下声明:
services:
some-service:
env_file:
- a.env
- b.env
以下文件:
# a.env
VAR=1
和
# b.env
VAR=hello
$VAR will be hello
.
环境
添加环境变量。您可以使用数组或字典。任何布尔值; true,false,yes no,都需要用引号括起来,以确保YML 解析器不会将它们转换为 True 或 False 。
仅具有键的环境变量将解析为计算机正在运行的计算机上的值,这对于特定于机密或特定于主机的值很有用。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
注意:如果您的服务指定了构建选项,则在构建期间,环境中定义的变量将不会自动显示。使用 build 的args 子选项来定义构建时环境变量。
显示
显示端口而不将它们发布到主机 - 它们只能被链接服务访问。只能指定内部端口。
expose:
- "3000"
- "8000"
扩展
在当前文件或其他文件中扩展另一个服务,可选地覆盖配置。
您可以将任何服务上的扩展与其他配置键一起使用。 extends 值必须是使用所需服务和可选文件键定义的字典。
extends:
file: common.yml
service: webapp
service
是要扩展的服务的名称,例如Web或数据库。该文件是定义该服务的Compose配置文件的位置
如果你省略 file Compose 在当前文件中查找服务配置。file 值可以是绝对路径或相对路径。如果指定相对路径,Compose 会将其视为相对于当前文件的位置。
可以扩展自己扩展另一个服务。你可以无限期地延长。 Compose不支持循环引用,如果遇到,则docker-compose会返回错误。
更多关于 extends,
详见扩展的文件。
外部链接
链接到此 docker-compose.yml 之外或甚至在 Compose 之外的容器,尤其是对于提供共享或公共服务的容器。在指定容器名称和链接别名(CONTAINER:ALIAS)时,external_links 遵循类似于链接的语义。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
注意:对于版本2文件格式,外部创建的容器必须至少连接到与链接到它们的服务相同的网络之一。
额外主机
添加主机名映射。使用与 docker client --add-host 参数相同的值。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
将在此服务的容器内的 / etc / hosts 中创建具有 ip 地址和主机名的条目,例如:
162.242.195.82 somehost
50.31.209.229 otherhost
组添加
指定容器内的用户将成为其成员的其他组(按名称或编号)。组必须存在于要添加的容器和主机系统中。一个有用的例子是当多个容器(作为不同用户运行)需要在主机系统上读取或写入相同文件时。该文件可由所有容器共享的组拥有,并在 group_add 中指定。有关更多详细信息,请参阅 Docker 文档。
完整的例子:
version: '2'
services:
myservice:
image: alpine
group_add:
- mail
在创建的容器中运行 id 将显示用户属于邮件组,如果未使用 group_add,则不会出现这种情况。
“健康”检查
Version 2.1 file format and up.
配置运行的检查以确定此服务的容器是否“健康”。有关 healthchecks 如何工作的详细信息,请参阅HEALTHCHECK Dockerfile 指令的文档。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
interval
, timeout
和 start_period 指定为持续时间,
test
必须是字符串或列表。如果是列表,则第一项必须是 NONE,CMD 或 CMD-SHELL 。如果它是一个字符串,它相当于指定 CMD-SHELL 后跟该字符串。
# Hit the local web app
test: ["CMD", "curl", "-f", "http://localhost"]
# As above, but wrapped in /bin/sh. Both forms below are equivalent.
test: ["CMD-SHELL", "curl -f http://localhost && echo 'cool, it works'"]
test: curl -f https://localhost && echo 'cool, it works'
要禁用图像设置的任何默认运行状况检查,可以使用 disable:true。这相当于指定 test:[“NONE”]。
healthcheck:
disable: true
注意:start_period 选项是更新的功能,仅适用于2.3文件格式。
图像
指定图像以从中启动容器。可以是存储库/标记或部分图像 ID 。
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
如果图像不存在,Compose 尝试拉取它,除非您还指定了构建,在这种情况下,它使用指定的选项构建它并使用指定的标记对其进行标记。
init
在2.2版文件格式中添加。
在容器内运行 init,转发信号并重新获取进程。设置布尔值以使用默认 init,或指定自定义路径的路径。
version: '2.2'
services:
web:
image: alpine:latest
init: true
version: '2.2'
services:
web:
image: alpine:latest
init: /usr/libexec/docker-init
独立
在2.1版本格式中添加
指定容器的隔离技术。在 Linux 上,唯一受支持的值是 default 。在 Windows 上,可接受的值是default,process 和 hyperv。有关详细信息,请参阅 Docker Engine 文档。
标签
使用 Docker 标签向容器添加元数据。您可以使用数组或字典。
建议您使用反向 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"
链接
链接到另一个服务中的容器。指定服务名称和链接别名(“SERVICE:ALIAS”),或仅指定服务名称。
web:
links:
- "db"
- "db:database"
- "redis"
链接服务的容器可以在与别名相同的主机名上访问,如果未指定别名,则可以访问服务名称。
链接还以与 depends_on 相同的方式表示服务之间的依赖关系,因此它们确定服务启动的顺序。
注意:如果同时定义链接和网络,则它们之间具有链接的服务必须共享至少一个共同的网络才能进行通信。我们建议使用网络。
记录
记录服务的配置。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
driver 程序名称指定服务容器的日志记录驱动程序,与 docker run 的--log-driver 选项一样(此处记录)。
默认值为json-file。
driver: "json-file"
driver: "syslog"
driver: "none"
注意:只有json文件和日志驱动程序驱动程序才能直接从 docker-compose up 和 docker-compose日志中获取日志。使用任何其他驱动程序将不会打印任何日志。
使用 options 键为日志记录驱动程序指定日志记录选项,与docker run 的--log-opt 选项一样。
记录选项是键值对。 syslog 选项的一个示例:
driver: "syslog"
options:
syslog-address: "tcp://192.168.0.42:123"
网络模型
版本2文件格式及以上。替换版本1网络选项。
网络模式。使用与 docker client --net 参数相同的值,以及特殊表单服务:[service name]。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
网络
版本2文件格式及以上。替换版本1网络选项。
要加入的网络,引用顶级网络密钥下的条目。
services:
some-service:
networks:
- some-network
- other-network
别名
网络上此服务的别名(备用主机名)。同一网络上的其他容器可以使用服务名称或此别名连接到其中一个服务的容器
由于 aliases 是网络范围的,因此相同的服务可以在不同的网络上具有不同的别名。
注意:网络范围的别名可以由多个容器共享,甚至可以由多个服务共享。如果是,则无法保证名称将解析为哪个容器。
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
在下面的示例中,提供了三个服务(web,worker 和 db),以及两个网络(new 和 legacy)。可以在新网络上的主机名 db 或 database 以及旧网络上的 db 或 mysql 中访问 db 服务。
version: '2'
services:
web:
build: ./web
networks:
- new
worker:
build: ./worker
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:
ipv4_address, ipv6_address
在加入网络时为此服务指定容器的静态IP地址。
顶级网络部分中的相应网络配置必须具有包含子网和网关配置的 ipam 块,覆盖每个静态地址。如果需要IPv6 寻址,则必须设置 enable_ipv6 选项。
实例:
version: '2.1'
services:
app:
image: busybox
command: ifconfig
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
gateway: 172.16.238.1
- subnet: 2001:3984:3989::/64
gateway: 2001:3984:3989::1
link_local_ips
指定链接本地IP列表。链路本地 IP 是属于众所周知的子网的特殊 IP,由运营商完全管理,通常取决于部署它们的架构。因此它们不受 docker(IPAM驱动程序)管理。
示例网页:
version: '2.1'
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
pid
pid: "host"
pid: "container:custom_container_1"
pid: "service:foobar"
如果设置为以下形式之一:container:<container_name>,service:<service_name>,则服务将共享指定容器或服务的 PID 地址空间。
如果设置为 “host”,则服务的 PID 模式将是主机 PID 模式。这打开了容器和主机操作系统之间的 PID 地址空间共享。使用此标志启动的容器将能够访问和操作裸机计算机命名空间中的其他容器,反之亦然。
pids_limit
在2.1版本格式中添加
调整容器的 PID 限制。设置为 -1 表示无限制的 PID。
pids_limit: 10
ports
暴露端口。指定两个端口(HOST:CONTAINER),或仅指定容器端口(将选择随机主机端口)。
注意:在使用 HOST:CONTAINER 格式映射端口时,使用低于 60 的容器端口时可能会遇到错误的结果,因为 YAML 将以 xx:yy 格式解析数字为 sexagesimal(基数为60)。因此,我们建议始终将端口映射明确指定为字符串。
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
security_opt
覆盖每个容器的默认标签方案。
security_opt:
- label:user:USER
- label:role:ROLE
stop_grace_period
指定在发送 SIGKILL 之前,如果它未处理 SIGTERM(或使用 stop_signal 指定了任何停止信号),则尝试停止容器时要等待多长时间。指定为持续时间。
stop_grace_period: 1s
stop_grace_period: 1m30s
默认情况下,在发送 SIGKILL 之前,stop 会等待10秒钟以使容器退出。
停止信号
stop_signal: SIGUSR1
storage_opt
在2.1版文件格式中添加
为此服务设置存储驱动程序选项。
storage_opt:
size: '1G'
sysctls
在版本2.1格式中添加
要在容器中设置的内核参数。您可以使用数组或字典。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits
覆盖容器的默认 ulimits 。您可以将单个限制指定为整数,也可以将软/硬限制指定为映射。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
userns_mode
在版本2.1的格式中添加
userns_mode: "host"
如果 Docker 守护程序配置了用户名称空间,则禁用此服务的用户名称空间。有关更多信息,请参阅dockerd 。
volumes, volume_driver
装载路径或命名卷,可选择指定主机上的路径(HOST:CONTAINER)或访问模式(HOST:CONTAINER:ro)。对于版本2文件,需要使用顶级卷键指定命名卷。
您可以在主机上安装相对路径,该路径将相对于正在使用的Compose配置文件的目录进行扩展。相对路径应始终以.
或者 ...
开始。
volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql
# Specify an absolute path mapping
- /opt/data:/var/lib/mysql
# Path on the host, relative to the Compose file
- ./cache:/tmp/cache
# User-relative path
- ~/configs:/etc/configs/:ro
# Named volume
- datavolume:/var/lib/mysql
如果不使用主机路径,则可以指定 volume_driver 。
volume_driver: mydriver
有几点需要注意,具体取决于您使用的 Compose 文件版本:
您可以在版本2文件中使用 volume_driver,但它仅适用于匿名卷(在映像中指定的卷,或在没有显式命名卷或主机路径的volumes下指定)。要为命名卷配置驱动程序,请使用顶级 volumes 选项中条目下的驱动程序密钥。
有关更多信息,请参阅 Docker 卷和卷插件
volumes_from
从另一个服务或容器挂载所有卷,可选择指定只读访问(ro)或读写(rw)。如果未指定访问级别,则将使用读写。
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
Notes
- The
container:...
格式仅支持版本2文件格式。 在版本1中,您可以使用容器名称而不将其标记为:
- `service_name`
- `service_name:ro`
- `container_name`
- `container_name:rw`
重启
no 是默认的重启策略,在任何情况下都不会重启容器。指定 always 时,容器始终重新启动。如果退出代码指示出现故障错误,则 on-failure 策略将重新启动容器。
- restart: no
- restart: always
- restart: on-failure
cpu_count,
每个都是单个值,类似于 docker run 对应物。
注意:2.2版中添加了以下选项:
cpu_count
,cpu_percent
,cpus
.
cpu_count: 2
cpu_percent: 50
cpus: 0.5
cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1
user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
mem_limit: 1000000000
memswap_limit: 2000000000
mem_reservation: 512m
privileged: true
oom_score_adj: 500
read_only: true
shm_size: 64M
stdin_open: true
tty: true
指定持续时间
某些配置选项(例如healthcheck的interval
和 timeout
子选项将持续时间作为字符串接受,其格式如下所示
2.5s
10s
1m30s
2h32m
5h34m56s
支持的单元是e us
, ms
, s
, m
和 h
.
指定字节值
某些配置选项(例如 blkio_config 的 device_read_bps 子选项)接受字节值作为字符串,格式如下所示:
2b
1024kb
2048k
300m
1gb
支持的单位是 b,k,m 和 g,以及它们的替代符号 kb,mb 和 gb。请注意,目前不支持十进制值。
虽然可以动态声明卷作为服务声明的一部分,但本部分允许您创建可以跨多个服务重用的命名卷(不依赖于volumes_from),并且可以使用 docker 命令行轻松检索和检查或 API 。有关更多信息,请参阅 docker volume 子命令文档。
以下是双服务设置的示例,其中数据库的数据目录与另一个服务作为卷共享,以便可以定期备份:
version: "2.2"
services:
db:
image: db
volumes:
- data-volume:/var/lib/db
backup:
image: backup-service
volumes:
- data-volume:/var/lib/backup/data
volumes:
data-volume:
顶级 volumes 键下的条目可以为空,在这种情况下,它将使用引擎配置的默认驱动程序(在大多数情况下,这是 local 驱动程序)。 (可选)您可以使用以下键进行配置:
驱动
指定应为此卷使用哪个卷驱动程序。默认为Docker Engine配置使用的任何驱动程序,在大多数情况下是 local 。如果驱动程序不可用,则当 docker-compose 尝试创建卷时,Engine 将返回错误。
driver: foobar
driver_opts
将选项列表指定为键值对,以传递给此卷的驱动程序。这些选项取决于驱动程序 - 请参阅驱动程序的文档以获取更多信息。可选的。
driver_opts:
foo: "bar"
baz: 1
外部
如果设置为 true,则指定已在 Compose 之外创建此卷。 docker-compose up 不会尝试创建它,如果它不存在则会引发错误。
external 不能与其他卷配置键(driver,driver_opts)一起使用。
在下面的示例中,Compose 不会尝试创建名为 [projectname] _data 的卷,而是查找仅称为 data 的现有卷,并将其挂载到 db 服务的容器中。
version: '2'
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
external: true
您还可以在 Compose 文件中与用于引用它的名称分别指定卷的名称:
volumes:
data:
external:
name: actual-name-of-volume
注意:在较新版本的 Compose 中,不推荐使用 external.name 属性,而只是使用 name 属性。
标签
在2.1版文件格式中添加。
使用 Docker 标签向容器添加元数据。您可以使用数组或字典。
labels:
com.example.description: "Database volume"
com.example.department: "IT/Ops"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Database volume"
- "com.example.department=IT/Ops"
- "com.example.label-with-empty-value"
命名
在2.1版本格式中添加,
为此卷设置自定义名称。
version: '2.1'
volumes:
data:
name: my-app-data
它还可以与 external 属性结合使用:
version: '2.1'
volumes:
data:
external: true
name: my-app-data
网络配置参考
顶级网络密钥允许您指定要创建的网络。有关 Compose 使用 Docker 网络功能的完整说明,请参阅网络指南。
驱动
指定应该为此网络使用哪个驱动程序。
默认驱动程序取决于您正在使用的 Docker Engine 的配置方式,但在大多数情况下,它将在单个主机上 birdge 并 overlay 在Swarm上。
如果驱动程序不可用,Docker Engine 将返回错误。
driver: overlay
driver_opts
将选项列表指定为键值对,以传递给此网络的驱动程序。这些选项取决于驱动程序 - 请参阅驱动程序的文档以获取更多信息。可选的。
driver_opts:
foo: "bar"
baz: 1
enable_ipv6
在2.1版文件格式中添加。
在此网络上启用 IPv6 网络。
ipam
指定自定义 IPAM 配置。这是一个具有多个属性的对象,每个属性都是可选的:
driver:自定义 IPAM 驱动程序,而不是默认值。
完整的例子:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
ip_range: 172.28.5.0/24
gateway: 172.28.5.254
aux_addresses:
host1: 172.28.1.5
host2: 172.28.1.6
host3: 172.28.1.7
options:
foo: bar
baz: "0"
内部
默认情况下,Docker 还将桥接网络连接到它以提供外部连接。如果要创建外部隔离的覆盖网络,可以将此选项设置为 true 。
标签
在版本2.1的格式中添加
使用 Docker 标签向容器添加元数据。您可以使用数组或字典。
建议您使用反向DNS表示法来防止标签与其他软件使用的标签冲突。
labels:
com.example.description: "Financial transaction network"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Financial transaction network"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
外部
如果设置为 true,则指定已在 Compose 之外创建此网络。 docker-compose up 不会尝试创建它,如果它不存在则会引发错误。
external 不能与其他网络配置键(driver,driver_opts,group_add,ipam,internal)一起使用。
在下面的示例中,proxy 是通往外部世界的网关。而不是尝试创建一个名为 [projectname] _outside 的网络,Compose 将寻找一个简单地在外面调用的现有网络,并将代理服务的容器连接到它。
version: '2'
services:
proxy:
build: ./proxy
networks:
- outside
- default
app:
build: ./app
networks:
- default
networks:
outside:
external: true
您还可以在 Compose 文件中与用于引用它的名称分开指定网络名称:
networks:
outside:
external:
name: actual-name-of-network
变量替换
您的配置选项可以包含环境变量。 Compose 使用运行 docker-compose 的 shell 环境中的变量值。例如,假设 shell 包含 POSTGRES_VERSION = 9.3并且您提供此配置:
db:
image: "postgres:${POSTGRES_VERSION}"
当您使用此配置运行 docker-compose 时,Compose 会在 shell 中查找 POSTGRES_VERSION 环境变量并将其值替换为。对于此示例,Compose 会在运行配置之前将映像解析为 postgres:9.3。
如果未设置环境变量,请使用空字符串 Compose 替换。在上面的示例中,如果未设置POSTGRES_VERSION,则 image 选项的值为 postgres:。
您可以使用 .env 文件为环境变量设置默认值,Compose 将自动查找该文件。在 shell 环境中设置的值将覆盖 .env 文件中设置的值。
同时支持$VARIABLE
和 ${VARIABLE}
语法。此外,使用2.1文件格式时,可以使用典型的 shell 语法提供内联默认值:
${VARIABLE:-default}
如果在环境中未设置 VARIABLE 或为空,则将评估为default。
不支持其他扩展 shell 样式功能,例如 $ {VARIABLE / foo / bar} 。
当配置需要文字美元符号时,您可以使用 $$(双美元符号)。这也可以防止 Compose 插值,因此 $$ 允许您引用不希望由 Compose 处理的环境变量。
web:
build: .
command: "$$VAR_NOT_INTERPOLATED_BY_COMPOSE"
如果您忘记并使用单个美元符号($),Compose 会将该值解释为环境变量,并会警告您:
The VAR_NOT_INTERPOLATED_BY_COMPOSE is not set. Substituting an empty string.
撰写文档
- User guide