Skip to content

后端项目容器化(依赖关系镜像中docker-compose书写)-DockerFile学习之路

在开发项目的后期,我负责了我们后端项目的容器化,后端主要包含有两个主要的容器,一个就是我们的Nodejs后台服务,一个就是我们的MySQL服务容器,这里我以我们的项目为例,向大家分享一下如何在这种Nodejs服务容器依赖MYSQL服务容器的情景下,完成docker-compose的书写。

很多人觉得,docker-compse不是有一个depends-on吗,使用depends-on不就可以了嘛,但是,这些同学忽视了mysql容器本身的启动时间,单纯使用depends-on并不能真正解决我们的问题,我们下面使用一个小技巧来解决我们的问题

这里我们需要用到一个脚本,该脚本给我们用于不断访问mysql服务,知道可以访问到,继续运行Dockerfile的指令

这个脚步的可执行文件的地址如下,这是我们在部署的时候需要用到的 https://github.com/ufoscout/docker-compose-wait/releases/download/2.2.1/wait

那么我们怎么整合到我们的DockerFile中呢? 大家可以看看我们Nodejs的DockerFile

#制定node镜像的版本
FROM node:8.9-alpine
#声明作者
MAINTAINER WilsonZhong
#移动当前目录下面的文件到app目录下
ADD . /app/
#进入到app目录下面,类似cd
WORKDIR /app
#安装依赖
RUN npm install
#对外暴露的端口
EXPOSE 8080

ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.2.1/wait /wait
RUN chmod +x /wait

## Launch the wait tool and then your application
CMD /wait && npm start

可以看到,在把脚步的可执行二进制文件放到容器根目录后,然后赋予他权限,最后运行/wait && npm start, 这样我们就可以在我们的容器运行完成后再执行npm start

单单这样还不够,我们接下来编写我们的Docker-compose文件

version: "3"
services:
  server:
    image: wilsonzhong/earn_money_backend:latest
    container_name: earn_money_backend
    environment:
      HOST: mysql
    ports:
      - 8080:8080
    depends_on:
      - mysql
    environment:
      WAIT_HOSTS: mysql:3306
    volumes:
      - ~/public:/app/public
  mysql:
    image: wilsonzhong/earn_money_sql:latest
    environment:
      MYSQL_ROOT_PASSWORD: EarnMoney
    container_name: mysql
    hostname: mysql
    ports:
      - 3306:3306
    volumes:
      - ~/mysql:/var/lib/mysql

这里需要做的就是把我们需要等待的hosts作为环境变量给到我们的脚步,并使用depends_on规定启动顺序

到这里我们的问题基本解决,有同样疑虑的同学可以看看我这篇文章,自己尝试一下