后端项目容器化(依赖关系镜像中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规定启动顺序
到这里我们的问题基本解决,有同样疑虑的同学可以看看我这篇文章,自己尝试一下