docker-compose.yml 配置详情解读
build
在构建时应用的配置选项。
build
可以指定为包含构建上下文路径的字符串:
version: "3.8"
services:
webapp:
build: ./dir
或者,作为具有在context下指定的路径的对象,以及可选的Dockerfile和args:
version: "3.8"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
如果您指定image
和build
,那么Compose将使用中指定的webapp
和可选名称命名构建的图像:tag``image
build: ./dir
image: webapp:tag
这将产生一个名为webapp
并标记为的图像,该图像tag
是从构建的./dir
。
CONTEXT
包含Dockerfile的目录的路径,或者git存储库的URL。
当提供的值是相对路径时,它将被解释为相对于Compose文件的位置。该目录还是发送到Docker守护程序的构建上下文。
Compose用生成的名称构建并标记它,然后使用该图像。
build:
context: ./dir
DOCKERFILE
备用Dockerfile。
Compose使用一个替代文件进行构建。还必须指定一个构建路径。
build:
context: .
dockerfile: Dockerfile-alternate
ARGS
添加构建参数,这是只能在构建过程中访问的环境变量。
首先,在Dockerfile中指定参数:
ARG buildno
ARG gitcommithash
RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"
然后在build
键下指定参数。您可以传递映射或列表:
build:
context: .
args:
buildno: 1
gitcommithash: cdc3b19
build:
context: .
args:
- buildno=1
- gitcommithash=cdc3b19
build-args的范围
在Dockerfile中,如果您
ARG
在FROM
指令之前指定,ARG
则在下方的构建指令中不可用FROM
。如果您需要一个参数在两个地方都可用,请在FROM
说明中也指定它。 有关用法的详细信息,请参阅文档中的“ 了解ARGS和FROM之间的交互方式”部分。
您可以在指定构建参数时忽略该值,在这种情况下,构建时的值就是运行Compose的环境中的值。
args:
- buildno
- gitcommithash
使用布尔值时的提示
YAML布尔值(
"true"
,"false"
,"yes"
,"no"
,"on"
,"off"
)必须用引号括起来,这样分析器会将它们解释为字符串。
container_name
指定自定义容器名称,而不是生成的默认名称。
container_name: my-web-container
由于Docker容器名称必须唯一,因此如果您指定了自定义名称,则不能将服务扩展到1个以上的容器。尝试这样做会导致错误。
使用docker stack deploy时的注意事项
在集群模式下部署堆栈
container_name
时,将忽略该选项https://docs.docker.com/engine/reference/commandline/stack_deploy/)
deploy
以版本3文件格式添加。
指定与服务的部署和运行有关的配置。这只能部署到时生效群与 泊坞窗堆栈部署,并且被忽略
docker-compose up
和docker-compose run
。version: "3.8" services: redis: image: redis:alpine deploy: replicas: 6 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure
environment
添加环境变量。您可以使用数组或字典。任何布尔值(true,false,yes,no)都需要用引号引起来,以确保YML解析器不会将其转换为True或False。
仅具有键的环境变量在运行Compose的计算机上解析为它们的值,这对于秘密或特定于主机的值很有用。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
注意
如果您的服务指定了构建选项,
environment
则在构建过程中不会自动显示中定义的变量 。使用的 args子选项build
来定义构建时环境变量。
expose
公开端口而不将其发布到主机上-只有链接的服务才能访问它们。只能指定内部端口。
expose:
- "3000"
- "8000"
external_links
链接到在此范围之外docker-compose.yml
甚至在Compose之外开始的容器,尤其是对于提供共享或公共服务的容器。 同时指定容器名称和链接别名()时,请external_links
遵循与legacy选项相似的语义。links``CONTAINER:ALIAS
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
注意
使用docker stack deploy时的注意事项
在集群模式下部署堆栈
external_links
时,将忽略该选项
extra_hosts
添加主机名映射。使用与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
healthcheck
配置运行的检查以确定该服务的容器是否“健康”。有关运行状况检查 如何工作的详细信息,请参阅文档中的 HEALTHCHECK Dockerfile指令。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
interval
,timeout
并start_period
指定为 duration。
以3.4版文件格式添加。
该
start_period
选项以文件格式3.4添加。
test
必须是字符串或列表。如果它是一个列表,第一项必须是NONE
,CMD
或CMD-SHELL
。如果是字符串,则等效于指定CMD-SHELL
后跟该字符串。
# Hit the local web app
test: ["CMD", "curl", "-f", "http://localhost"]
如上所述,但包裹在中/bin/sh
。以下两种形式是等效的。
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
test: curl -f https://localhost || exit 1
要禁用图像设置的任何默认运行状况检查,可以使用disable: true
。这等效于指定test: ["NONE"]
。
healthcheck:
disable: true
image
指定用于启动容器的图像。可以是存储库/标签或部分图像ID。
image: redis
image: ubuntu:18.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
如果图像不存在,除非您还指定了build,否则Compose会尝试拉出它,在这种情况下,它将使用指定的选项来构建它并使用指定的标签对其进行标记。
labels
使用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"
links
警告
该
--link
标志是Docker的遗留功能。它最终可能会被删除。除非您绝对需要继续使用它,否则建议您使用 用户定义的网络 来促进两个容器之间的通信,而不要使用--link
。用户定义的网络不支持的一项功能
--link
是在容器之间共享环境变量。但是,您可以使用其他机制(例如卷)以更可控的方式在容器之间共享环境变量。
链接到另一个服务中的容器。指定服务名称和链接别名("SERVICE:ALIAS"
),或者仅指定服务名称。
web:
links:
- "db"
- "db:database"
- "redis"
可以使用与别名相同的主机名访问链接服务的容器,如果未指定别名,则可以使用服务名。
不需要链接即可使服务进行通信-默认情况下,任何服务都可以使用该服务的名称访问任何其他服务。(另请参见Compose中的Networking中的 Links主题。)
链接也以与depends_on相同的方式表示服务之间的依赖关系 ,因此它们确定了服务启动的顺序。
注意
如果同时定义链接和网络,则它们之间具有链接的服务必须共享至少一个公共网络才能进行通信。
使用docker stack deploy时的注意事项
在集群模式下部署堆栈
links
时,将忽略该选项
network_mode
网络模式。使用与docker client --network
参数相同的值,以及特殊形式service:[service name]
。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
注意
- 在集群模式下部署堆栈时,将忽略此选项 。
network_mode: "host"
不能与链接混合使用。
networks
要加入的网络,引用顶级networks
密钥下的条目 。
services:
some-service:
networks:
- some-network
- other-network
volumes
挂载主机路径或命名卷,指定为服务的子选项。
您可以将主机路径安装为单个服务的定义的一部分,而无需在顶级volumes
密钥中进行定义。
但是,如果要在多个服务之间重用卷,请在顶级volumes
密钥中定义一个命名卷。将命名卷与服务,群集和堆栈文件一起使用。
更改为版本3文件格式。
顶级卷键定义了一个命名卷,并从每个服务的
volumes
列表中引用了该卷。这将替换volumes_from
早期版本的Compose文件格式。
此示例显示了服务mydata
正在使用的命名卷()web
,以及为单个服务(db
服务 下的第一个路径volumes
)定义的绑定安装。该db
服务还使用一个名为dbdata
(db
service 下的第二个路径volumes
)的命名卷,但是使用旧的字符串格式定义它来装入命名卷。volumes
如图所示,命名卷必须在顶级 键下列出。
version: "3.8"
services:
web:
image: nginx:alpine
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
db:
image: postgres:latest
volumes:
- "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
- "dbdata:/var/lib/postgresql/data"
volumes:
mydata:
dbdata:
注意
想进一步了解配置详情可以 查阅 官方文档 https://docs.docker.com/compose/compose-file/#networks