docker-compose.yml文件
version: "3"
services:
mysql:
build: ./services/mysql
container_name: mysql
ports:
- ${MYSQL_PORT}:3306
volumes:
- ${MYSQL_DATA_PATH}:/var/lib/mysql:rw
- ./services/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
nodejs:
build: ./services/nodejs
container_name: nodejs
ports:
- ${NODE_PORT}:3000
links:
- mysql
depends_on:
- mysql
volumes:
- ./api:/var/www/html:rw
nodejs的dockerfile
FROM daocloud.io/library/node:11.6.0-alpine
WORKDIR /var/www/html
RUN npm config set unsafe-perm true
RUN npm config set registry https://registry.npm.taobao.org/
RUN npm install
RUN npm install -g pm2
CMD ./node_modules/.bin/sequelize db:migrate && npm start && pm2 list && pm2 logs
mysql的dockerfile文件
FROM mysql:8.0
现在问题是,mysql运行后接着nodejs也运行,去到./node_modules/.bin/sequelize db:migrate
数据迁移这一步时会报错,因为mysql启动了,但是初始化数据库还没有完成,所以连接不成功。
想问问各位大牛,有什么比较好的解决办法呢?
depends_on
只能决定启动顺序,不能决定就绪顺序(容器启动到程序就绪有个时间窗口)如果只用 compose 这样简单的编排工具,需要自己去做就绪检查。
另外,不建议将 mysql 等数据持久化层和应用放在一起,最好 易变更组件 和 不易变更组件 分别部署。