dcoker-compose 是用于定义和运行多容器 Docker 应用程序的工具,通过dcoker-compose 可以来运行多容器应用程序
但运行多容器时,就牵扯到运行顺序的问题。比如我运行一个微服务,需要首先运行注册中心,然后才需要运行其他的微服务项目
docker-compose 虽然有depends_on 这个参数解决容器的依赖、启动先后的问题
但是这个参数却不会等容器完全运行成功,在运行其他应用
这样就会导致 注册中心还没完全运行成功,其他服务已经启动,从而导致找不到注册中心而崩溃的问题
这里可以使用 docker-compose-wait 解决这个问题
docker-compose-wait是一个命令行实用程序,用于在使用 docker-compose 时等待其他 容器启动
- 固定的秒数后启动
- 直到目标图像上的 TCP 端口打开后启动
- 直到本地文件系统上存在文件或目录后启动
用法
修改应用的Dockerfile
FROM ibmjava:jre
MAINTAINER i@guiyunweb.com
# 添加docker-compose-wait工具
ADD https://github.guiyun.plus/ufoscout/docker-compose-wait/releases/download/2.9.0/wait /wait
RUN chmod +x /wait
# 运行
ARG JAR_FILE=build/libs/app-gateway.jar
RUN mkdir /opt/shareclasses
RUN mkdir /opt/app
COPY ${JAR_FILE} /opt/app/japp.jar
# 需要在运行命令并行运行/wait
CMD /wait && java -Xshareclasses:cacheDir=/opt/shareclasses -jar /opt/app/japp.jar
然后我们修改docker-compose.yml
version: '3'
services:
app-nacos:
image: nacos/nacos-server:2.0.3
environment:
MODE: standalone
ports:
- "8848:8848"
- "9848:9848"
container_name: app-nacos
hostname: app-nacos
app-gateway:
build:
context: ./app-gateway
ports:
- "8000:8000"
container_name: app-gateway
hostname: app-gateway
image: app-gateway
environment:
WAIT_HOSTS: app-nacos:8848
在docker-compose.yml
添加WAIT_HOSTS
参数
只有当 WAIT_HOSTS
参数中的所有对 host:port 都可用时,项目才会启动
示例项目
https://github.com/Guiyunweb/app-cloud-dubbo
其他的用法可以看这个地方