如何写docker-compose.yml,Docker compose file 参考文档 | Deepzz's Blog  https://deepzz.com/post/docker-compose-file.html

官方英文文档    Compose file reference - Docker  https://docs.docker.com/compose/compose-file/




Docker compose file 参考文档


Compose 文件是一个YAML文件,用于定义servicesnetwordvolumes。 Compose 文件的默认路径为./docker-compose.yml(后缀为.yml和.yaml都可以)。

一个service配置将会应用到容器的启动中,很像将命令行参数传递给docker run。 同样,network和volume定义类似于docker network createdocker volume create。 与Docker运行一样,默认情况下尊重Dockerfile中指定的选项(例如CMDEXPOSEVOLUMEENV) - 您不需要在docker-compose.yml中再次指定它们。

您可以在配置中使用具有类似Bash的${VARIABLE}语法使用环境变量 - 有关详细信息,请参阅Variable substitution

Service 配置参考

注意:有多个版本的Compose文件格式 - 版本1(旧版格式,不支持卷或网络)和版本2以及2.1(最新的)。 有关更多信息,请参阅版[Versioning]部分。

此部分包含服务定义支持的所有配置选项的列表。

build

在构建时应用的配置选项。

build可以指定为包含构建上下文路径,也可以根据上下文选择 dockerfile 和 args 指定的路径对象。

build: ./dir

build:
  context: ./dir
  dockerfile: Dockerfile-alternate
  args:
    buildno: 1

如果指定image字段来build,则Compose使用image中指定的webapptag(可选)命名构建的image

build: ./dir
image: webapp:tag

这里从./dir构建了一个镜像名为webapp,并打上标记为tag的镜像。

注意:在版本1文件格式中,build有两种不同的方法:

  1. 只允许字符串形式(build:.) - 而不是对象形式。
  2. 不允许与image一起build。 尝试这样做会导致错误。
context

版本2及以上使用,版本1只使用build。

它的值可以是Dockerfile的路径,或者是指向git仓库的url。

当提供的值是相对路径时,它被解释Compose文件位置的相对路径。 目录里的信息会被当做构建内容 发送到Docker守护进程。

Compose将使用生成的名字buildtag它,然后使用该image

build:
  context: ./dir
dockerfile

备用Dockerfile。

撰写将使用一个备用文件来构建。 还必须指定构建路径。

build:
  context: .
  dockerfile: Dockerfile-alternate

注意:在版本1文件格式中,dockerfile有两种不同的方法:

  1. 它与build同级出现,而不是子选项:
  build: .
  dockerfile: Dockerfile-alternate
  1. 不允许与image一起使用dockerfile。 尝试这样做会导致错误。
args

支持版本2及以上

添加构建参数,它们是只有在构建过程中才可访问的环境变量。

首先,在Dockerfile中指定参数:

ARG buildno
ARG password

RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

然后,指定build字段下的参数args。您可以mapping或list:

build:
  context: .
  args:
    buildno: 1
    password: secret

build:
  context: .
  args:
    - buildno=1
    - password=secret

指定build参数时,可以忽略该值,在这种情况下,构建时其值为运行Compose的环境中的值。

args:
  - buildno
  - password

注意:YAML布尔值(true,false,yes,no,on,off)必须用引号引起来,以便解析器将其解释为字符串。

cap_add, cap_drop

添加或删除容器功能。 有关完整列表,请参阅man 7功能。

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN
command

覆盖默认命令

command: bundle exec thin -p 3000

该命令也可以是一个list,在方式类似于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 client create选项相同的格式。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"
depends_on

Express之间的依赖关系,有两个效果:

  • docker-compose up 将按照依赖顺序启动服务。 在下面的示例中,db和redis将在web之前启动。
  • docker-compose up SERVICE 将自动包含SERVICE的依赖关系。 在以下示例中,docker-compose up web也将创建并启动db和redis。

列子:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意:在启动web之前,depends_on不会等待db和redis“就绪”,直到它们被启动。 如果您需要等待服务准备就绪,请参阅控制启动顺序了解有关此问题的更多信息以及解决问题的策略。

dns

自定义DNS服务器。可以是单个值或列表。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9
dns_search

自定义DNS搜索域。可以是单个值或列表。

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com
tmpfs

在容器中安装临时文件系统。可以是单个值或列表。

tmpfs: /run
tmpfs:
  - /run
  - /tmp
entrypoint

覆盖默认的entrypoint

entrypoint: /code/entrypoint.sh

entrypoint也可以是一个列表,存在方式类似于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
env_file

从文件添加环境变量。可以是单个值或列表。

如果已使用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

注意:如果您的service指定了build选项,则在build过程中将不会自动显示环境文件中定义的变量。 使用build的args子选项来定义构建时环境变量。

environment

添加环境变量。您可以使用数组或字典。 任意布尔值:true,false,yes no,需要用引号括起来,以确保它们不会被YML解析器转换为True或False。

只有一个键的环境变量被解析为它在Compose正在运行的机器上的值,这对于secret或host-specific values是有帮助的。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

注意:如果您的服务指定了build选项,则在build期间将不会自动显示在环境中定义的变量。 使用build的args子选项来定义构建时环境变量。

expose

公开端口,而不将其发布到主机 - 它们只能访问链接服务。只能指定内部端口。

expose:
 - "3000"
 - "8000"
extends

在当前文件或另一个文件中扩展另一个服务,可选地覆盖配置。

您可以将extends与其他配置字段一起使用。 extends值必须是使用必需的server和可选file字段定义的字典。

extends:
  file: common.yml
  service: webapp

server正在扩展的服务的名称,例如web或数据库。 该文件是定义该服务的Compose配置文件的位置。

如果省略file Compose在当前文件中查找服务配置。 file值可以是绝对路径或相对路径。 如果指定相对路径,则Compose将其视为相对于当前文件的位置。

您可以扩展本身扩展其他服务。 您可以无限期地延长。 Compose不支持循环引用,如果遇到一个,docker-compose会返回一个错误。

有关扩展的更多信息,请参阅扩展文档

external_links

链接到在docker-compose.yml外部启动的容器,甚至在Compose之外,特别是对于提供共享或公共服务的容器。 external_links在指定容器名称和链接别名(CONTAINER:ALIAS)时遵循类似于links的语义。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

注意:如果您使用的是版本2文件格式,则外部创建的容器必须连接到至少一个与链接到它们的服务相同的网络。

extra_hosts

添加主机名映射。使用与docker client --add-host参数相同的值。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

具有ip地址和主机名的条目将在此服务的容器中的/etc/hosts中创建,例如:

162.242.195.82  somehost
50.31.209.229   otherhost
group_add

指定容器中的用户将成为其成员的其他组(按名称或号码)。 组必须存在于要添加的容器和主机系统中。 这是有用的一个例子是当多个容器(作为不同的用户运行)需要在主机系统上读取或写入相同的文件。 该文件可以由所有容器共享的组拥有,并在group_add中指定。 有关更多详细信息,请参阅Docker文档

version: '2'
services:
    image: alpine
    group_add:
      - mail

在创建的容器中运行id将显示用户属于mail组,如果未使用group_add,则不会是这种情况。

image

指定要从中启动容器的映像。可以是存储库/标记或部分图像ID。

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

如果image不存在,Compose会尝试拉取它,除非你也指定了build,在这种情况下,它使用指定的选项构建它,并用指定的标签标记它。

注意:在版本1文件格式中,不允许与image一起使用build。 尝试这样做会导致错误。

isolation

Added in version 2.1 file format. 指定容器的隔离技术。在Linux上,唯一支持的值为default。 在Windows上,可接受的值为defaultprocesshyperv。 有关详细信息,请参阅Docker Engine文档

labels

使用Docker labels向容器添加元数据。 您可以使用list或mapping。

建议您使用reverse-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"
links

链接到另一个服务中的容器。请指定服务名称和链接别名(SERVICE:ALIAS),或仅指定服务名称。

web:
  links:
   - db
   - db:database
   - redis

如果未指定别名,则可以在与别名相同的主机名或服务名称处访问链接服务的容器。

链接也以与depends_on相同的方式表示服务之间的依赖关系,因此它们确定服务启动的顺序。

注意:如果您定义链接和networks,则具有它们之间的链接的服务必须共享至少一个公共网络以便进行

logging

Version 2 file format and up. In version 1, use log_driver and log_opt.

记录服务的配置。

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

driver名称指定了服务容器的日志驱动程序,,如docker运行的--log-driver选项(documented here)。

默认值为json-file。

driver: "json-file"
driver: "syslog"
driver: "none"

注意:只有json-filejournald驱动程序使日志可以直接从docker-compose updocker-compose logs获取。 使用任何其他驱动程序将不会打印任何日志。

使用options键为记录驱动程序指定日志记录选项,例如docker run--log-opt选项。

日志记录选项是key-value对。 syslog选项的示例:

driver: "syslog"
options:
  syslog-address: "tcp://192.168.0.42:123"
log_driver

Version 1 file format only. In version 2, use logging.

指定日志驱动程序。默认值为json-file

log_driver: syslog
log_opt

Version 1 file format only. In version 2, use logging.

将记录选项指定为key-value对。 syslog选项的示例:

log_opt:
  syslog-address: "tcp://192.168.0.42:123"
net

Version 1 file format only. In version 2, use network_mode.

网络模式。 使用与docker client --net参数相同的值。 container:...形式可以接受服务名称,而不是容器名称或ID。

net: "bridge"
net: "host"
net: "none"
net: "container:[service name or container name/id]"
network_mode

Version 2 file format and up. In version 1, use net.

网络模式。 使用与docker client --net参数相同的值,以及特殊表单 service:[service name]

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
networks

Version 2 file format and up. In version 1, use net.

要加入的网络, 引用top-level networks key 下的条目。

services:
  some-service:
    networks:
     - some-network
     - other-network
aliases

网络上此服务的别名(备用主机名)。同一网络上的其他容器可以使用服务名称或此别名连接到服务的容器之一。

由于aliases是网络范围的,所以相同的服务可以在不同的网络上具有不同的别名。

注意:网络范围的别名可以由多个容器共享,甚至可以由多个服务共享。 如果是,那么该名称将解析为哪个容器不能保证。

一般格式如下所示。

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

在下面的示例中,提供了三个服务(webworkerdb),以及两个网络(newlegacy)。 db服务在new网络上的主机名dbdatabaselegacy网络中的dbmysql是可达的。

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寻址,则com.docker.network.enable_ipv6驱动程序选项必须设置为true。

version: '2'

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
    driver_opts:
      com.docker.network.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

Added in version 2.1 file format.

指定link-local IPs。 link-local IPs是属于众所周知的子网并且完全由运营商管理的特殊IP,通常取决于它们被部署的架构。 因此,它们不由docker(IPAM driver)管理。

用法示例:

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模式设置为主机PID模式。 这将打开容器和主机操作系统之间的PID地址空间的共享。 使用此标志启动的容器将能够访问和操作裸机机器命名空间中的其他容器,反之亦然。

ports

公开端口。 指定两个端口(HOST:CONTAINER),或只指定容器端口(将选择随机主机端口)。

注意:当映射HOST:CONTAINER格式的端口时,当使用低于60的容器端口时,您可能会遇到错误的结果,因为YAML将解析格式为xx:yy的数字为六进制(基数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"
security_opt

覆盖每个容器的默认标签方案。

security_opt:
  - label:user:USER
  - label:role:ROLE
stop_signal

设置停止容器的备用信号。 默认情况下停止使用SIGTERM。 使用stop_signal设置备用信号将导致停止发送该信号。

stop_signal: SIGUSR1
ulimits

覆盖容器的默认ulimits。 您可以将单个限制指定为整数或soft/hard限制作为映射。

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000
volumes, volume_driver

装载路径或命名卷(可选)指定主机上的路径(HOST:CONTAINER)或访问模式(HOST:CONTAINER:ro)。 对于版本2文件,命名卷需要使用top-level volumes key`指定。 当使用版本1时,Docker Engine将自动创建命名卷(如果不存在)。

您可以在主机上安装相对路径,相对于正在使用的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

请注意,对于版本2文件,此驱动程序将不适用于named volumes(在使用declaring the volume时,应使用driver选项)。 对于版本1,named volumes和container volumes都将使用指定的驱动程序。

注意:如果您还指定了volume_driver,则不会执行路径扩展。

有关更多信息,请参阅https://docs.docker.com/engine/userguide/dockervolumes/Volume Plugins

volumes_from

从另一个服务或容器装入所有卷,可选择指定只读访问(ro)或读写(rw)。 如果未指定访问级别,则将使用读写。

volumes_from:
 - service_name
 - service_name:ro
 - container:container_name
 - container:container_name:rw

注意container:...格式仅支持版本2文件格式。 在版本1中,您可以使用容器名称,而不将其标记为:

- service_name
- service_name:ro
- container_name
- container_name:rw
cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, oom_score_adj, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir

每个都是一个单一的值,类似于它的docker运行对应。

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
privileged: true

oom_score_adj: 500

restart: always read_only: true shm_size: 64M stdin_open: true tty: true 

注意:以下选项仅适用于版本2及更高版本:* oom_score_adj

Volume configuration reference

虽然可以作为服务声明的一部分来即时声明卷,但是此部分允许您创建可以跨多个服务重用的命名卷(不依赖volumes_from),并且可以使用docker命令行轻松检索和检查 或API。 有关更多信息,请参阅docker volume子命令文档。

driver

指定应为此卷使用哪个卷驱动程序。 默认为local。 如果驱动程序不可用,Docker Engine将返回错误。

driver: foobar
driver_opts

将选项列表指定为要传递给此卷的驱动程序的key-value pairs。 这些选项是驱动程序相关的 - 请参阅驱动程序文档以获取更多信息。 可选的。

driver_opts:
   foo: "bar"
   baz: 1
external

如果设置为true,则指定该卷已在Compose外部创建。 docker-compose up不会尝试创建它,并且如果它不存在将会引发一个错误。

external不能与其他卷配置键(driverdriver_opts)一起使用。

在下面的示例中,不是尝试创建名为[projectname] _data的卷,Compose将查找现有的卷,简单地称为数据,并将其挂载到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
labels

Added in version 2.1 file format.

使用Docker labels向容器添加元数据。 您可以使用数组或字典。

建议您使用反向DNS符号来防止您的标签与其他软件使用的标签冲突。

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"

Network configuration reference

顶层网络键允许您指定要创建的网络。 有关Compose使用Docker网络功能的完整说明,请参阅Networking guide

driver

指定应为此网络使用哪个驱动程序。

默认驱动程序取决于您使用的Docker引擎是如何配置的,但在大多数情况下,它将是单个主机上的bridge和Swarm上的overlay

如果驱动程序不可用,Docker Engine将返回错误。

driver: overlay
driver_opts

指定选项列表作为要传递给此网络驱动程序的键值对。 这些选项是driver-dependent - consult的驱动程序文档的更多信息。 可选的。

driver_opts:
    foo: "bar"
    baz: 1
enable_ipv6

Added in version 2.1 file format.

在此网络上启用IPv6网络。

ipam

指定自定义IPAM配置。 这是一个具有多个属性的对象,每个属性都是可选的:

  • driver:自定义IPAM驱动程序,而不是默认值。
  • config:具有零个或多个配置块的列表,每个配置块包含以下任意键:
    • subnet: 表示网段的CIDR格式的子网
    • ip_range: 从中分配容器IPs的IP范围
    • gateway: 主子网的IPv4或IPv6网关* aux地址:网络驱动程序使用的辅助IPv4或IPv6地址,作为从主机名到IP地址的映射

A full example:

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
internal

Version 2 file format and up.

默认情况下,Docker还将桥接网络连接到它以提供外部连接。 如果要创建外部隔离的覆盖网络,您可以将此选项设置为true。

labels

Added in version 2.1 file format.

使用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"
external

如果设置为true,则指定此网络已在Compose之外创建。 docker-compose up不会尝试创建它,并且如果它不存在将会引发一个错误。

外部不能与其他网络配置键(driverdriver_optsgroup_addipaminternal)一起使用。

在下面的示例中,proxy是到外部世界的网关。 而不是尝试创建一个名为[projectname] _outside的网络,Compose将查找一个现有的网络,简单地调用外outside并连接outside服务的容器。

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

Versioning

目前有三个版本的Compose文件格式:

  • 版本1,传统格式。 这是通过省略YAML根目录下的版本键来指定的。
  • 版本2,推荐格式。 这是使用版本:’2’条目在YAML的根目录指定。
  • 版本2.1,升级超过版本2,利用了Docker Engine的最新特性。 使用版本:“2.1”条目指定YAML根目录。

要将项目从版本1移动到2,请参阅升级部分。

注意:如果您使用多个Compose文件或扩展服务,每个文件必须是相同的版本 - 您不能在单个项目中混合版本1和2。

根据您使用的版本,有几点不同:

  • 结构和允许的配置键
  • 必须运行的最低Docker Engine版本
  • 撰写关于网络的行为 这些差异如下所述。
Version 1

未声明版本的组合文件被视为“版本1”。 在这些文件中,所有服务都在文档的根目录处声明。

版本1由Compose到1.6.x支持。 它将在未来的Compose版本中被弃用。

版本1文件无法声明命名卷,网络或构建参数。

例:

web:
  build: .
  ports:
   - "5000:5000"
  volumes:
   - .:/code
  links:
   - redis
redis:
  image: redis
Version 2

使用版本2语法的撰写文件必须指示文档根目录下的版本号。 所有服务必须在服务键下声明。

Compose 1.6.0+支持版本2文件,并需要版本1.10.0+的Docker引擎。

可以在volumes键下声明命名卷,并且可以在networks关键字下声明网络。

简单示例:

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: redis

一个更广泛的例子,定义卷和网络:

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    networks:
      - front-tier
      - back-tier
  redis:
    image: redis
    volumes:
      - redis-data:/var/lib/redis
    networks:
      - back-tier
volumes:
  redis-data:
    driver: local
networks:
  front-tier:
    driver: bridge
  back-tier:
    driver: bridge
Version 2.1

升级版本2,引入仅适用于Docker Engine版本1.12.0+的新参数

引入以下附加参数: * link_local_ips * isolation * labels for volumes and networks

Upgrading

在大多数情况下,从版本1移动到2是一个非常简单的过程:

  1. 将整个文件缩进一级,并在顶部放置一个services:键。
  2. 添加一个version: '2'行在文件的顶部。

如果您使用特定的配置功能,则更复杂: * dockerfile: This now lives under the build key:

  build:
  context: .
  dockerfile: Dockerfile-alternate
  • log_driverlog_opt: These now live under the logging key: logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
  • 与环境变量的链接:如环境变量引用中所述,由链接创建的环境变量已经过时了一段时间。 在新的Docker网络系统中,它们已被删除。 您应该直接连接到相应的主机名,或者自己设置相关的环境变量,使用link hostname: ``` web: links:
    • db environment:
    • DB_PORT=tcp://db:5432 ```
  • external_links:Compose在运行版本2项目时使用Docker网络,因此链接的行为略有不同。 特别地,两个容器必须共同连接到至少一个网络,以便进行通信,即使明确地链接在一起。 将外部容器连接到应用程序的默认网络,或者将外部容器和服务的容器都连接到外部网络。
  • net: 这现在由network_mode替换:

    net: host    ->  network_mode: host
    net: bridge  ->  network_mode: bridge
    net: none    ->  network_mode: none
    

    如果你使用 net: "container:[service name]", 用 network_mode: "service:[service name]" 替换。

    net: "container:web"  ->  network_mode: "service:web"
    

    如果你使用 net: "container:[container name/id]", 值可以不变。

    net: "container:cont-name"  ->  network_mode: "container:cont-name"
    net: "container:abc12345"   ->  network_mode: "container:abc12345"
    
  • 具有命名卷的卷:这些必须现在必须在Compose文件的顶级卷部分中显式声明。 如果服务装载称为数据的命名卷,则必须在顶层卷部分中声明数据卷。 整个文件可能如下所示:

    version: '2'
    services:
    db:
      image: postgres
      volumes:
        - data:/var/lib/postgresql/data
    volumes:
    data: {}
    

    默认情况下,Compose会创建一个以项目名称为前缀的卷。 如果你想要它只是被称为数据,声明它为外部

    volumes:
    data:
    external: true
    

Variable substitution

您的配置选项可以包含环境变量。 Compose使用运行docker-compose的shell环境中的变量值。 例如,假设shell包含EXTERNAL_PORT = 8000,并且您提供此配置:

web:
  build: .
  ports:
    - "${EXTERNAL_PORT}:5000"

当使用此配置运行docker-compose up时,Compose会在shell中查找EXTERNAL_PORT环境变量并将其值代入。在本示例中,Compose在创建Web容器之前将端口映射解析为“8000:5000”

如果未设置环境变量,则Compose将替换为空字符串。 在上面的示例中,如果未设置EXTERNAL_PORT,则端口映射的值为:5000(这当然是无效的端口映射,并且将在尝试创建容器时导致错误)。

支持$VARIABLE${VARIABLE}语法。 此外,当使用2.1文件格式时,可以使用典型的shell语法提供内联默认值: * 如果VARIABLE在环境中未设置或为空,${VARIABLE:-default}将评估为默认值。 * 只有在环境中未设置VARIABLE的情况下,${VARIABLE-default}才会评估为默认值。

不支持其他扩展的shell样式功能,例如${VARIABLE/foo/bar}

当您的配置需要一个字母美元符号时,您可以使用$$(双美元符号)。 这也防止了Compose内插值,所以$$允许你引用你不想由Compose处理的环境变量。

web:
  build: .
  command: "$$VAR_NOT_INTERPOLATED_BY_COMPOSE"

如果您忘记并使用单个美元符号($),Compose将该值解释为环境变量并将警告您:

未设置VAR_NOT_INTERPOLATED_BY_COMPOSE。 替换空字符串。

参考地址: [1]https://docs.docker.com/compose/compose-file

本文链接:https://deepzz.com/post/docker-compose-file.html参与评论 »

--EOF--


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐