概要
docker-compose 可以方便组合多个 docker 容器服务, 但是, 当容器服务之间存在依赖关系时, docker-compose 并不能保证服务的启动顺序。
docker-compose 中的 depends_on 配置是容器的启动顺序, 并不是容器中服务的启动顺序.
环境清理
在做实验的时候,我在很多地方都定义了这些容器,为了不受之前启动过的容器和镜像的影响。在本次实验之前,做一下环境的清理。
删除所有容器
docker rm -f $(docker ps -qa)
删除所有镜像
docker rmi -f $(docker images -qa)
项目改造前
情况描述
docker-compose.yml 中定义了2个服务,但这里只能定义到服务容器的启动顺序。通常来说这种方式无法满足我们严格的顺序启动要求。比如说,我们需要等待 mysql 服务完成启动完毕后,再启动 nacos。
虽然这2个服务都启动了,但 nacos启动报错了。也就是说我们无法登陆nacos 页面,具体如图:

项目改造
安装依赖
yum -y install nc
编写脚本
在项目的根目录下创建脚本文件,并赋予执行权限
vim ep.shchmod +x ep.sh
其脚本内容:
#!/bin/bash#set -x#******************************************************************************# @file : ep.sh# @author : liangcy02# @date : 2018-08- 1 10:18:43## @brief : entry point for manage service start order# history : init#******************************************************************************: ${SLEEP_SECOND:=2}wait_for() {echo Waiting for $1 to listen on $2...while ! nc -z $1 $2; do echo waiting...; sleep $SLEEP_SECOND; done}declare DEPENDSdeclare CMDwhile getopts "d:c:" argdocase $arg ind)DEPENDS=$OPTARG;;c)CMD=$OPTARG;;?)echo "unkonw argument"exit 1;;esacdonefor var in ${DEPENDS//,/ }dohost=${var%:*}port=${var#*:}wait_for $host $portdoneeval $CMD
测试脚本
测试 mysql
./ep.sh -d 192.168.3.18:3306 -c 'echo "start mysql service here"'
参数说明: -d 后面跟着 ip地址:端口号 -c 监听到端口启动后,需要执行的命令 这里的测试,就是说监听3.18 的3306端口,如果端口启动了,那就 打印输出 start mysql service here
测试 nacos
./ep.sh -d 192.168.3.18:8848 -c 'echo "start nacos service here"'
编写 docker-compose.yml
关键点
思考问题
我们编写的脚本中 -c 后面要跟启动 服务的命令,但为什么是 bin/docker-startup.sh 这个命令?
答案
因为 entrypoint 指令会覆盖原来Dockerfile 文件的最后一条 entrypoint 指令,关键是这一条指令一般都是启动我们的服务的指令。那这条指令我们怎么找?
①、打开 nacos-docker 在github上的地址:https://github.com/nacos-group/nacos-docker
②、找到 Dockerfile 文件
③、Dockerfile 文件最后一条 entrypoint 指令
具体详细内容
version : '3.8'services:ruoyi-nacos:container_name: ruoyi-nacosimage: nacos/nacos-serverbuild:context: ./nacosenvironment:- MODE=standalonevolumes:- ./nacos/logs/:/home/nacos/logs- ./nacos/conf/application.properties:/home/nacos/conf/application.properties- ./ep.sh:/ep.shentrypoint: /ep.sh -d ruoyi-mysql:3306 -c 'bin/docker-startup.sh';ports:- "8848:8848"- "9848:9848"- "9849:9849"depends_on:- ruoyi-mysqlruoyi-mysql:container_name: ruoyi-mysqlimage: mysql:5.7build:context: ./mysqlports:- "3306:3306"volumes:- ./mysql/conf:/etc/mysql/conf.d- ./mysql/logs:/logs- ./mysql/data:/var/lib/mysqlcommand: ['mysqld','--innodb-buffer-pool-size=80M','--character-set-server=utf8mb4','--collation-server=utf8mb4_unicode_ci','--default-time-zone=+8:00','--lower-case-table-names=1']environment:MYSQL_ROOT_PASSWORD: password
MySQL和Nacos镜像
启动镜像
docker-compose up

