docker-compose运行时docker-entrypoint.sh未生效 应用连接MySQL失败怎么解决
问题排查
你当前配置存在以下几处错误导致等待逻辑未生效、数据库连接失败:
- Dockerfile未指定
docker-entrypoint.sh作为入口脚本,当前CMD直接执行npm start,等待数据库的逻辑完全没有运行 - 基础镜像
node:10默认没有预装dockerize工具,即使执行入口脚本也会报错 - MySQL服务在docker-compose中定义的名称为
db,你配置的MYSQL_HOST=mysql、entrypoint中等待的mysql:3306都和实际服务名不匹配,无法解析到数据库实例;同时报错日志显示Sequelize尝试连接127.0.0.1:3306,说明你的代码中未正确读取MYSQL_HOST环境变量,写死了本地地址 - MySQL服务的初始化环境变量被注释,没有创建web配置中指定的
me用户、mydb数据库,即使网络连通也会鉴权失败 docker-entrypoint.sh没有可执行权限,也缺少shell声明头,直接执行会报错
修正后配置
Dockerfile
FROM node:10 # 预装dockerize工具 RUN apt-get update && apt-get install -y wget && \ wget https://github.com/jwilder/dockerize/releases/download/v0.6.1/dockerize-linux-amd64-v0.6.1.tar.gz && \ tar -C /usr/local/bin -xzvf dockerize-linux-amd64-v0.6.1.tar.gz && \ rm dockerize-linux-amd64-v0.6.1.tar.gz RUN mkdir /app WORKDIR /app COPY . /app RUN npm install # 给入口脚本赋予执行权限 RUN chmod +x docker-entrypoint.sh EXPOSE 3000 # 指定入口脚本 ENTRYPOINT ["./docker-entrypoint.sh"]
docker-compose.yaml
version: "3.9" networks: app-tier: driver: bridge services: db: platform: linux/x86_64 image: mysql:5.7 networks: - app-tier container_name: mysql_container restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root_secure_pass MYSQL_DATABASE: mydb MYSQL_USER: me MYSQL_PASSWORD: 1234 web: depends_on: - db networks: - app-tier environment: - MYSQL_HOST=db - MYSQL_USER=me - MYSQL_PASSWORD=1234 - MYSQL_DATABASE=mydb build: .
docker-entrypoint.sh
#!/bin/bash dockerize -wait tcp://db:3306 -timeout 20s echo "Start server" npm run start
额外检查项
确认你的Sequelize连接配置读取环境变量作为数据库地址,不要写死本地地址,示例如下:
const sequelize = new Sequelize( process.env.MYSQL_DATABASE, process.env.MYSQL_USER, process.env.MYSQL_PASSWORD, { host: process.env.MYSQL_HOST, dialect: 'mysql', port: 3306 } )
配置修改完成后执行docker-compose build --no-cache重新构建镜像,再启动服务即可。
内容的提问来源于stack exchange,提问作者user5406131
相关产品推荐
相关产品推荐

