compose.yaml 的 image commond working_dir 和 dockerfile的 from cmd workdir 区别在哪里 。为什么 dockerfile制定过了。compose还要再写一个。是处于个性化还是 有不同的意义
如果 dockerfile 的 from 是 node:16 ,compose.yaml 的 images 是 node:18 那么 直接 docker run 用的 就是默认 16 的node 但是 compose up启动用的就是 18的node
depends_on:
总结 :
depends_on 可以设置容器的启动顺序,如果一个服务依赖另一个服务 ,那么就可以自定义控制
所以来服务的状态来启动目标服务
有几种语法:
depends_on: - db - redis
short syntax
1、跟依赖服务的名字
Compose creates services in dependency order. In the following example,
db
andredis
are created beforeweb
.Compose removes services in dependency order. In the following example,
web
is removed beforedb
andredis
.Compose guarantees dependency services have been started before starting a dependent service. Compose waits for dependency services to be "ready" before starting a dependent service.
弊端:不会等依赖服务完全初始化完成 只是一个 ready
2、
depends_on:
可以有三个属性:
restart 设置为 true时 依赖服务有更新,compose自动重启
condition: 自定义条件决定什么时候启动该服务 有三个属性
required: 是否与依赖服务之间存在 上下文关系
condition 的三个属性
service_started :不会等依赖服务完全初始化完成 只是一个 ready 等同直接写服务名
service_healthy: 该属性的值 由 另一个容器的 service下字段 healthy_check 决定
service_completion_successfully:依赖服务完全初始化
介绍
healthy_check:
version: '3'
services:
rabbitmq:
hostname: rabbitmq_host
container_name: 'mq'
image: rabbitmq:3.9.11-management
restart: always
ports:
- "5772:5672" # AMQP
- "15772:15672" # Web UI
networks:
- app-network
environment:
RABBITMQ_DEFAULT_USER: root
RABBITMQ_DEFAULT_PASS: pwd
RABBITMQ_DEFAULT_VHOST: /
volumes:
- rabbitmq_data:/var/lib/rabbitmq/mnesia
healthcheck:
test: [ "CMD", "rabbitmq-diagnostics", "ping" ]
interval: 50s
timeout: 5s
retries: 3
selenium:
container_name: 'selenium'
image: selenium/standalone-chrome
restart: always
ports:
- "4444:4444"
networks:
- app-network
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:4444/wd/hub/status" ]
interval: 30s
timeout: 5s
retries: 3
db:
container_name: 'mysql8'
image: mysql:8.0.32
# hostname: mysql_host
user: root
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
environment:
LANG: C.UTF-8
MYSQL_ROOT_PASSWORD: pwd
MYSQL_DATABASE: yinlian
ports:
- "3306:3306"
volumes:
- "./data/db/data:/var/lib/mysql"
- "./data/db/mysql-files:/var/lib/mysql-files"
- "./build/docker/mysqldb/my.cnf:/etc/my.cnf"
networks:
- app-network
healthcheck:
test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
interval: 30s
timeout: 5s
retries: 3
app-producer:
container_name: 'producer'
build:
context: .
dockerfile: Dockerfile
ports:
- "8001:8001"
command: ['echo','hello world, Frank']
depends_on:
db:
condition: service_healthy
rabbitmq:
condition: service_healthy
selenium:
condition: service_healthy
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
rabbitmq_data:
driver: local
ports
compose.yaml 的顶级的 volumes 和 services 的 volumes 的区别
短格式 语法 short syntax vs 长格式语法 long syntax
长格式 无法配置匿名卷,请用短格式
为什么我每次启动相当于重新启动,副本一直是 1
如果有多个 volume 或bind mount 有同一个 挂载点(指向同一个目录)以最后一个为准
执行 docker compose config
没有
$(pwd):/app 和 vol2:/app
只有 compose-vol
修改 为 $(pwd):/app1 vol2:/app2 后再次 config
报错:
不能使用 $(pwd) 可以使用 ./
如果在顶级设置的 volumes 或者 networks 字段 没有在 srevices 里面被引用,那么 docker compose 不会 创建 该 volume 或者 network