build
这个配置选项应用在构建镜像时。
build可以指定包含构建上下文路径的字符串,或者是context指定一个路径和可选的dockerfile和args。
- build: ./dir
-
- build:
- context: ./dir
- dockerfile: Dockerfile-alternate
- args:
- buildno: 1
如果指定了image和build,那么compose以image中指定的名称命名构建的镜像,如:
- build: ./dir
- image: webapp:tag
compose将由./dir构建的镜像命名为webapp,tag为tag。
注意:在version 1文件格式中,build有两点不同的地方:
1.只允许build: .一种格式,不允许对象格式。
2.不允许build与image一起使用。
context
context可用于verion 2文件格式或以上版本,version 1中只用build。
指定一个包含Dockerfile的目录路径,或git存储库url。
当指定了一个相对路径,就解析为相对compose文件所在的目录。这个目录也是发送到docker daemon的构建上下文。
dockerfile
替代的Dockerfile
compose使用另一个dockerfile文件构建镜像。必须指定一个context构建路径。
注意:在verions 1文件格式中,dockerfile有两点不同:
1.它出现在build的同级,而不是作为它的子选项:
- build: .
- dockerfile: Dockerfile-alternate
2.不允许dockerfile与image一起使用。
args
此选项只支持version 2文件格式和之上版本。
增加build参数,这些参数是只在构建期间访问的环境变量。
首先,在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文件中可以只指定参数名不设置值,在这种情况下参数的值就是compose运行所在shell的环境变量值。
- args:
- – buildno
- – password
注意:YAML布尔值(true,false,yes,no,on,off)必须用引号引起来,以便解析器将其解释为字符串。
command
覆盖默认的命令。
- command: bundle exec thin -p 3000
命令也可以是一个列表,与dockerfile中的列表类似:
- command: [bundle, exec, thin, -p, 3000]
container_name
指定一个自定义的容器名称,而不是一个生成的默认名称。
- container_name: my-web-container
因为docker容器名称必须是唯一的,所以如果指定了一个自定义的名称,不能扩展一个服务超过1个容器。
depends_on
指定服务之间的依赖关系,有两种效果:
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
注意:depends_on不会等到db和redis状态为“ready”才启动web – 它只等到它们已经开始启动。如果需要等到一个服务变为ready,查看Controlling startup order
dns
自定义DNS服务器。可以是单个值或列表。
- dns: 8.8.8.8
- dns:
- – 8.8.8.8
- – 9.9.9.9
dns_search
自定义search域名。可以是单个值或列表。
- dns_search: example.com
- dns_search:
- – dc1.example.com
- – dc2.example.com
tmpfs
需要version 2文件格式或以上版本。
在容器内部挂载一个临时文件系统。可以是单个值或列表。
tmpfs: /run
tmpfs:
– /run
– /tmp
entrypoint
覆盖默认的entrypoint。
- entrypoint: /code/entrypoint.sh
entrypoint也可以是一个列表:
- 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将会覆盖默认使用ENTRYPOINT Dockerfile指令设置服务镜像的entrypoint,也会清除这个镜像的任何默认命令 – 意味着如果Dockerfile中指定的任何CMD指定将会忽略。
env_file
从一个文件添加环境变量。可以是单个值或列表。
如果使用docker-compose -f FILE指定了一个compose文件,那么在env_file的路径就是相对于那个文件所在的目录。
在environment关键词指定的环境变量将会覆盖env_file设置的值。
- env_file: .env
-
- env_file:
- – ./common.env
- – ./apps/web.env
- – /opt/secrets.env
env文件中每行的格式为VAR=VAL。以#开头的行将忽略,也包括空行。
- # Set Rails/Rack environment
- RACK_ENV=development
注意:如果服务指定了一个build选项,定义在env文件中的变量在构建期间不可用。使用build的子选项来定义在构建期间使用的环境变量。
VAL的值按原样使用,不再不修改。 例如,如果值由引号括起来(通常是shell变量的情况),引号将包含在传递给Compose的值中。
environment
添加环境变量。可以使用数组或字典。任何的布尔值,true,false,yes,no需要用引号括起来,以确保YML解析器把它们转换为True或False。
- environment:
- RACK_ENV: development
- SHOW: ‘true’
- SESSION_SECRET:
-
- environment:
- – RACK_ENV=development
- – SHOW=true
- – SESSION_SECRET
expose
暴露只在链接服务之间可用的端口。只能指定内部使用的端口。
- expose:
- – "3000"
- – "8000"
extends
在当前文件或另一个文件扩展另一个服务,可选地覆盖配置。
extends可以与service相关的配置项一起使用。extends的值必须是一个字典,其中service是必须的以及一个可选的file选项。
- extends:
- file: common.yml
- service: webapp
service指定的是扩展服务到当前服务的名称。例如web或databases。file指定的是定义有那个service的compose文件。
如果不指定file选项,compose则在当前文件查找service的配置。file值可以是一个绝对的或相对的路径。如果指定一个相对的路径,这个路径就是相对于当前文件所在目录的路径。
可以扩展一个本身扩展有另一个的服务。
external_links
链接那些在docker-compose.yml外部启动的容器或甚至是在compose外部的,特别是那么提供共享或通用服务的容器。
external_links在指定容器名称和链接别名(CONTAINER:ALIAS)时遵循类似于链接的语义。
- external_links:
- – redis_1
- – project_db_1:mysql
- – project_db_1:postgresql
注意:如果使用的是version 2文件格式的compose文件,外部创建的容器必须是连接到与链接到它们的服务同处至少一个相同的网络。
extra_hosts
添加主机名映射。与docker客户端的–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
image
指定从其启动容器的镜像。可以是repository/tag或部分镜像ID。
- image: redis
- image: ubuntu:14.04
- image: tutum/influxdb
- image: example-registry.com:4000/postgresql
- image: a4bc65fd
如果镜像不存在,compose尝试拉取它,除非也指定了build,在这种情况下它使用指定的选项来构建镜像并使用指定的tag来作标记。
注意:在version 1文件格式中,不允许build和image一起使用。
links
链接到另一个服务的容器。可以指定服务名称和链接别名(SERVICE:ALIAS),或只是服务名称。
- web:
- links:
- – db
- – db:database
- – redis
可以使用与别名一样的主机名访问链接服务的容器,或者如果没有指定别名就使用服务名称。
链接也以与depends_on相同的方式表示服务之间的依赖关系,因此它们可以决定服务启动的顺序。
注意:如果定义了links和网络,为了能够通信,链接的服务之间必须至少在一个相同的网络。
logging
version 2文件格式或更高版本。在version 1中,使用是的log_driver和log_opt。
服务的日志配置。
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"
使用options关键词指定日志驱动的日志选项,就像docker run的log-opt选项。
日志选项是键值对。一个syslog选项的示例:
- driver: "syslog"
- options:
- syslog-address: "tcp://192.168.0.42:123"
network_mode
要求version 2文件格式和之后版本。version 1使用net。
网络模式。与docker客户端的–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文件格式和之后版本。version 1使用net。
要加入的网络,在顶层networks关键词之下引用网络。
- 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和legay)。在net网络上可以使用db主机名或database访问db服务,在legacy网络上可以使用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地址。
顶层networks区域的相关网络配置必须有一个指定有子网和网关覆盖每个静态地址的配置的ipadm块。如果要使用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
ports
暴露端口。可以指定两个端口(HOST:CONTAINER),或只指定一个容器端口(将选择一个随机的主机端口)。
- 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"
ulimits
覆盖容器默认的ulimits。可以指定单个限制或soft/hard限制。
- ulimits:
- nproc: 65535
- nofile:
- soft: 20000
- hard: 40000
volumes, volume_driver
挂载路径或命名数据卷,可选地指定主机的路径(HOST:CONTAINER),或权限模式(HOST:CONTAINER:ro)。对于version 2文件,命名数据卷必须在顶层volumes关键词中指定。当使用version 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。
注意,对于version 2文件,这个驱动不会应用到命名数据卷(当声明数据卷时应该使用driver选项)。对于version 1,命名数据卷和容器数据卷使用这个指定的驱动。
volumes_from
挂载从另一个服务或容器的所有数据卷,可选地指定只读权限(ro)或读写(rw)。如果没有指定权限级别,将使用读写(rw)权限。
- volumes_from:
- – service_name
- – service_name:ro
- – container:container_name
- – container: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
- 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