suyeonme

[Docker] docker-compose.yml의 init.sql이 작동하지 않는 경우 해결 방법 본문

프로그래밍👩🏻‍💻/Docker

[Docker] docker-compose.yml의 init.sql이 작동하지 않는 경우 해결 방법

suyeonme 2022. 8. 21. 18:29

docker-compose.yml

docker-compose.yml 파일의 volumns에 ./init.sql:/docker-entrypoint-initdb.d/init.sql와 같이 추가하면 컨테이너가 시작할 때init.sql 파일이 실행된다.

version: '3.8'
services:
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    ports:
      - '3306:3306'
    volumes:
      # 데이터 베이스 초기화(init.sql)
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
volumes:
  db:
    driver: local

init.sql

docker-compose.yml과 같은 위치(root)에 init.sql 파일을 생성한다. 아래 파일의 경우, 컨테이너가 시작될 때 User테이블을 생성한다.

DROP DATABASE IF EXISTS `mysql-db`;

CREATE DATABASE `mysql-db`;

USE `mysql-db`;

DROP TABLE IF EXISTS `User`;

CREATE TABLE `User` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(20),
  `company` VARCHAR(20),
  `position` VARCHAR(20)
);

 

위와 같이 수정한 뒤, docker-compose restart를 했으나 init.sql이 실행되지 않았다. 

해결 방법

1. docker-compose.yml의 환경변수에 MYSQL_USER: user를 추가한다. (디폴트로 root user가 생성됨)

2. 데이터베이스 volumns를 클리어한다.

# volumns 클리어
docker volume prune

# volumns가 클리어되었는지 확인
docker volume ls

# db 컨테이너가 생성한 filesystemp 클리어
rm -rf ./cms/conf/mysql 

# 컨테이너 재빌드
docker-compose up -d --build

3.  docker-entrypoint-initdb.d 폴더로 이동후 init.sql 파일이 존재하는지 확인

# db 컨테이너 CLI로 접속후

# docker-entrypoint-initdb.d 폴더로 이동
cd docker-entrypoint-initdb.d

# 제대로 실행되었다면 init.sql 파일이 존재
ls
# init.sql

 

Comments