yml 파일내에서
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 20s
retries: 10
healthcheck을 통해서 mysql부터 실행시켜준후 express를 실행시켜주었는데도 에러가 발생했다.
docker exec -it mysql컨테이너id mysql -u root -p
SHOW DATABASES;
test라는 스키마가 있는데도 계속 찾을수 없다고 나왔다.
문제는 host 바인딩이다.
version: "3.8"
services:
mysql:
image: "mysql"
volumes:
- data:/var/lib/mysql
environment:
- MYSQL_DATABASE=test
- MYSQL_ROOT_PASSWORD=brgndy96
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 20s
retries: 10
backend:
build: ./backend
ports:
- "80:80"
volumes:
- logs:/app/logs
- ./backend:/app
- /app/node_modules
depends_on:
mysql:
condition: service_healthy
volumes:
data:
logs:
const sequelize = new Sequelize(
process.env.MYSQL_DATABASE,
process.env.MYSQL_USER,
process.env.MYSQL_ROOT_PASSWORD,
{
port: process.env.MYSQL_PORT,
host: "mysql", // compose.yml의 service이름과 같아야함
dialect: "mysql",
logging: false,
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000,
},
}
);
시퀄라이즈 index.js에서 host는 compose.yml에서 작성해준 mysql의 서비스 이름과 같아야한다.
그래야지 해당 서비스 이름을 도커에서 인식하고 연결시켜주는 것이다.
그후에 compose up을 다시 해주면 정상적으로 실행 된다.